Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将SO“U广播设置到套接字失败,原因是”;无效参数";_C++_Xcode - Fatal编程技术网

C++ 将SO“U广播设置到套接字失败,原因是”;无效参数";

C++ 将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

我的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(&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