2011-09-21 569 views
1

我的C++应用程序正在发送二进制数据作为UDP数据包。 sendto()调用返回EINVAL(无效参数),但我没有看到我传递的参数有什么问题。发送UDP数据包时发生“无效参数”,但是哪一个?

我做了应用程序的使用strace这里是revelant系统调用:

socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 33 
setsockopt(33, SOL_IP, IP_RECVERR, [1], 4) = 0 
fcntl(33, F_SETFD, FD_CLOEXEC)   = 0 
bind(33, {sa_family=AF_INET, sin_port=htons(1510), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 

sendto(33, "\2055\5\0\0\0\1\0\0\0\1\20 \0t\0c\300Ny\274B\10*\206H\206\367\r\2\5\0\200\200\331'\344\272\322\362sD\277\312\300\23\240\224\212\16\20\1\0\0\22", 55, 0, {sa_family=AF_INET, sin_port=htons(1510), sin_addr=inet_addr("219.132.100.190")}, 16) = -1 EINVAL (Invalid argument) 

有谁看到哪些参数是无效的?

该应用程序最近已被移植到支持IPv6,但我不知道这与它有什么关系。

+0

您的路由表是否包含到该地址的有效路由?什么是你的系统上的'sizeof(sockaddr_in)'? –

+0

@Ben:是的,有一个有效的路线,16是sockaddr_in的正确长度。 –

+1

绑定到127.0.0.1可能绑定到'lo'。 219.132.100.190很可能不是一个有效的数据发送地址'lo' – PlasmaHH

回答

2

您将您的本地地址绑定到127.1,但您发送到非本地主机地址。我需要检查,但也许EINVAL的意思是“你不能发送127.1数据包离开主机。”

+0

或者等价地,路由表中没有使用'lo'接口的'219.132.100.190'的目的地路由。 –