我的IDE:xCode,OS X 10.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);
上面的代码是关于发送udp消息到广播,但结果信息是:
set opt err: Invalid argument
sendto err: Permission denied
并且相同的代码在vc ++ / windows中运行良好。
答案 0 :(得分:1)
可能参数sizeof(bool)
返回无效参数。正如您在以下链接中所看到的,未定义sizeof(bool)
应该提供1。
我还认为你不必在函数调用中强制转换指针。只有&
。
您能提供一些sendto()
函数的代码来确定其他错误吗?
答案 1 :(得分:0)
我将bc更改为int并解决了问题
答案 2 :(得分:0)
已经暗示,您的 optval 是错误的。
下面列出的套接字选项可以使用setsockopt(2)和 使用getsockopt(2)读取,套接字级别设置为SOL_SOCKET 所有插座。除非另有说明,否则 optval是指向int的指针。
您正在给它一个指向bool
的指针。
幸运的是,该功能能够检测到此情况(可能sizeof(bool)
与您平台上的sizeof(int)
不同,否则该函数将bool
重新解释为int
只会导致一个无法识别的值;无论如何它都是UB),因此您会收到一个不错的错误,告诉您参数是错误的。
请记住,该函数不知道数据的类型(因为它获得了void*
),因此即使它想要接受int
或bool
或llama
是不可能的。