在 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上会不会屏蔽广播?不知道可不可以。
考虑使用多播。
我正在使用 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上会不会屏蔽广播?不知道可不可以。
考虑使用多播。