通过WiFi从UDP套接字读取总是超时

时间:2016-12-06 20:15:24

标签: c++ sockets

我有一段代码发送UDP广播来扫描我们本地网络上的设备。当我通过以太网插入时,它工作正常,但是当通过WiFi连接时它不会。

使用WiFi时,在UDP中连接有什么不同吗?

您可以在下面找到我正在使用的代码。使用WiFi时,select始终返回0

struct sockaddr_in addr;

//Create socket
if ((fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
{
    perror("socket");
    exit(1);
}

/* set up destination address */
memset((char *)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(48620);
addr.sin_addr.s_addr = inet_addr("192.168.3.255");

//TRYING TO BIND, NOT WORKING
if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
{
    int a = WSAGetLastError(); //ERROR 10049
    perror("bind"); //Says NO ERROR
  }


//allow broadcast
int broadcast = 1;
if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*)&broadcast, sizeof(broadcast)) == -1)
    exit(1);


    if (sendto(fd, (const char *)&request, sizeof(request), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)
    {
        perror("sendto");
        exit(1);
    }

    do
    {
        FD_ZERO(&rdFs);
        FD_SET(fd, &rdFs);
        lTimeout.tv_sec = 1;
        lTimeout.tv_usec = 000000;
        lSelRet = select(fd, (fd_set*)&rdFs, NULL, NULL, &lTimeout);
        if (lSelRet > 0 && FD_ISSET(fd, &rdFs))
        {
            addrFromSize = sizeof(addrFrom);
            lResult = recvfrom(fd, bufferIn, sizeof(bufferIn), 0, (struct sockaddr *) &addrFrom, &addrFromSize);
            //Treat result
        }
    } while (lSelRet > 0);

注意:即使使用WiFi,我也可以建立TCP连接并与设备通信,它只是无法正常工作的UDP广播

注意2:目前正在Windows上进行测试,但我会在

之后将其移植到Linux

编辑:按照Remy的建议添加了SO_BROADCAST

1 个答案:

答案 0 :(得分:1)

最后让它工作,这是一个代码问题,而不是路由器问题。

问题是滥用绑定功能,我需要使用我的IP而不是广播IP。

/* set up destination address */
memset((char *)&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(48620);
addr.sin_addr.s_addr = inet_addr("192.168.3.134");   //<== Windows : My IP, not the broadcast IP
addr.sin_addr.s_addr = INADDR_ANY; //Linux

if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1)
{
    perror("bind");
}

编辑:奇怪的是,在Windows中你必须绑定到发送请求的ip,而在linux上你必须绑定到INADDR_ANY。