C++ 将SO“U广播设置到套接字失败,原因是”;无效参数";
我的IDE:xCode,OSX10.10.4C++ 将SO“U广播设置到套接字失败,原因是”;无效参数";,c++,xcode,C++,Xcode,我的IDE:xCode,OSX10.10.4 int s = socket(AF_INET, SOCK_DGRAM, 0); bool bc = true; int ret = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (const void*)&bc, sizeof(bool)); if(ret < 0){ perror("set opt err:"); } sockaddr_in tarAddr; memset(&tarAd
int s = socket(AF_INET, SOCK_DGRAM, 0);
bool bc = true;
int ret = setsockopt(s, SOL_SOCKET, SO_BROADCAST, (const void*)&bc, sizeof(bool));
if(ret < 0){
perror("set opt err:");
}
sockaddr_in tarAddr;
memset(&tarAddr, 0, sizeof(sockaddr_in));
tarAddr.sin_family = AF_INET;
tarAddr.sin_port = htons(5000);
tarAddr.sin_addr.s_addr = INADDR_BROADCAST;
char szMsg[100] = {0};
strcpy(szMsg, "hello");
int len = sizeof(sockaddr);
ret = sendto(s, szMsg, strlen(szMsg), 0, (sockaddr*)&tarAddr, len);
if(ret < 0){
perror("sendto err:");
}
close(s);
同样的代码在vc++/windows中运行良好。可能参数
sizeof(bool)
返回无效值。正如您在下面的链接中所看到的,没有定义sizeof(bool)
应该提供1
我还认为您不必在函数调用中强制转换指针。只要有和就足够了
您能否提供sendto()
函数的一些代码来确定其他错误?我将bc更改为int,这就解决了问题正如所暗示的,您的optval是错误的
发件人:
下面列出的插座选项可以通过使用setsockopt(2)和
使用getsockopt(2)读取,将套接字级别设置为SOL_socket,以便
所有插座。除非另有说明,optval是指向int的指针
您给它一个指向bool
的指针
幸运的是,函数能够检测到这一点(可能sizeof(bool)
不同于平台上的sizeof(int)
,或者它将bool
重新解释为int
只会导致一个它无法识别的值;无论如何,它都是UB),所以你会有一个很好的错误告诉你你的论点是错误的
请记住,函数不知道数据的类型(因为它得到一个void*
),所以即使它希望能够接受int
或bool
或llama
,它也无法这样做。第二个错误是第一个单人页面的结果,它将此错误描述为“试图发送到一个网络/广播地址,就像它是一个单播地址一样。”socket
函数可能会失败,然后返回-1而不是描述符。您不检查它。尝试检查它。问题是bool。它可能在little endian计算机上正常工作,但实际上应该是int。
set opt err: Invalid argument
sendto err: Permission denied