将SO_BROADCAST设置为套接字失败,并显示“Invalid argument”

时间:2016-01-14 08:16:40

标签: c++ xcode

我的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中运行良好。

3 个答案:

答案 0 :(得分:1)

可能参数sizeof(bool)返回无效参数。正如您在以下链接中所看到的,未定义sizeof(bool)应该提供1。

Is sizeof(bool) defined?

我还认为你不必在函数调用中强制转换指针。只有&

就足够了

您能提供一些sendto()函数的代码来确定其他错误吗?

答案 1 :(得分:0)

我将bc更改为int并解决了问题

答案 2 :(得分:0)

已经暗示,您的 optval 是错误的。

来自the socket manpage

  

下面列出的套接字选项可以使用setsockopt(2)和          使用getsockopt(2)读取,套接字级别设置为SOL_SOCKET          所有插座。除非另有说明,否则 optval是指向int的指针

您正在给它一个指向bool的指针。

幸运的是,该功能能够检测到此情况(可能sizeof(bool)与您平台上的sizeof(int)不同,否则该函数将bool重新解释为int只会导致一个无法识别的值;无论如何它都是UB),因此您会收到一个不错的错误,告诉您参数是错误的。

请记住,该函数不知道数据的类型(因为它获得了void*),因此即使它想要接受intboolllama是不可能的。