在 win 10 机器上使用 winsock 的 UDP 广播无法正常工作

UDP Broadcasting using winsock on a win 10 machine not working

我正在使用 c++ 和 winsock 制作 LAN 多人游戏,我是否已经创建了自己的协议来将两台机器相互连接。该协议涉及在本地 LAN 上广播一条消息,奇怪的是,它在我用来测试我的代码的两台机器中的一台上不起作用。奇怪的是,如前所述,它在一台机器上工作,而在另一台机器上却没有。我已经使用 wireshark 来监视传出数据包,并且数据包没有在故障机器上发送,即使 sendto() 返回了正确的字节数。机器之间的唯一区别是一台(故障机器)使用的是 win10,另一台使用的是 win8。

在 windows 10 和 windows 8 之间的 winsock library/networking 层中是否存在任何可能导致此问题的差异?另外,对于可能导致失败的原因,您还有其他想法吗?

发送广播的代码如下所示:

sockaddr_in send_addr;
send_addr.sin_family = AF_INET;
send_addr.sin_port = htons(PORT);
send_addr.sin_addr.s_addr = inet_addr("255.255.255.255");

int iResult = sendto(sock,
    reinterpret_cast<char*>(&packet),
    sizeof(Packet),
    0,
    (SOCKADDR *)&send_addr,
    sizeof(send_addr));

if (iResult == SOCKET_ERROR)
{
    printf("Failed to send broadcastmsg");
}

接收它的代码如下所示:

sockaddr_in sender_addr;
int sender_addrLen = sizeof(sender_addr);

Packet recvdPacket = {};

int iResult = recvfrom(sock,
    reinterpret_cast<char*>(&recvdPacket),
    sizeof(recvdPacket),
    0,
    (SOCKADDR*)&sender_addr,
    &sender_addrLen);

if (iResult > 0)
{
    return recvdPacket;
}
return Packet{};

您需要启用广播设置 SO_BROADCAST 才能发送广播消息: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85).aspx , Why do we need SocketOptions.SO_BROADCAST to enable broadcast?

char broadcast = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast))

您还应该使用定向广播(例如,192.168.0.255)而不是互联网广播(255.255.255.255)。我相信你不需要网播。

还有,你能打印sendto返回的值吗?是 iResult == sizeof(Packet) 吗?

最后,Packet的大小是多少?是 class 吗?您正在将 &packet 重新解释为 char *。您必须确保那里没有错误。

在Win10 PC上会不会屏蔽广播?不知道可不可以。

考虑使用多播。