2017-03-02 30 views
2

所以我通过一个参数,我的主要是一个IP作为char *名称ipStr为什么我从sendto()中获得“无效参数”?

然后我初始化的变量调用sendto()之前举行它的长度:

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
char buffer[8]; 
socklen_t ipLen = sizeof(ipStr); 

      res = sendto(sock, buffer, sizeof(buffer), 0, 
        (struct sockaddr*) &ipStr, ipLen); 

但我仍然得到Invalid argument作为一个返回的错误。

我没有得到g ++编译错误,所以我不知道问题出在哪里。

编辑

我发现我ipLen之前没有删除sizeof,改变上述但还是收到Invalid argument

+0

套接字是否正确返回?什么是ipStr设置? – Joe

+0

是'sock'正确返回,我不知道ipStr设置为什么意思。 – xeon48

+1

ipstr可能是你的“无效论点”,但我没有看到它的代码,只是你声称。让我们看看能够证明您的问题的完整代码。 – Joe

回答

3

您的sockaddr可能是错的,它是一个struct,其中包含地址和其他一些数据的二进制表示。这是一个sockaddr_in转换为sockaddr

尝试:

struct sockaddr_in ip4addr; 

ip4addr.sin_family = AF_INET; 
ip4addr.sin_port = htons(1234); 
addrDest.sin_addr.s_addr = inet_addr("1.2.3.4"); 
0

socklen_t ipLen = sizeof(ipStr)返回ipStr数据类型的大小,而不是字符串的长度它指向。 ipStr的数据类型是char *,因此sizeof(ipStr)产生8(或在32位系统上的4)。所以你的参数可能不会被正确解释。

改为使用socklen_t ipLen = strlen(ipStr)

+0

'sendto'不期望任何字符串或字符串长度。 –

+0

@ n.m。 'ipLen'传递给'sendto',如果'ipStr'实际上是一个'char *',那么'ipLen = sizeof(ipStr)'或者没有意义(如果sendto没有使用)或者错误,不是吗? –

+0

iplen是无意义的,但没关系,因为ipstr不应该在那里。 –

相关问题