我有一个程序,它会定期广播一条简单的 UDP 消息以表明在 LAN 中的存在。我有一台笔记本电脑和一台台式电脑,它们都通过 Wifi 连接到家庭路由器。两台电脑都运行 Windows。
我注意到台式电脑可以检测到笔记本电脑的存在。但是笔记本电脑无法检测到台式电脑的存在。即使它们运行的是完全相同的代码。
使用 Wireshark 后,我发现无论我在哪台计算机上运行 Wireshark,桌面->笔记本电脑消息都不会显示。但是,无论我在哪台计算机上运行 Wireshark,笔记本电脑->桌面消息都会显示在 Wireshark 中。
我也尝试使用我的 Android 手机作为路由器,得到了完全相同的结果。
我想知道是否有任何 Windows 设置可以阻止从台式机发送到笔记本电脑的消息。
编辑:
我已经使用“数据包发送器”来消除我的应用程序可能存在的任何问题。
当我从我的广播一个数据包时桌上型电脑,则该消息不会出现在两台计算机中的任何一台的 Wireshark 中。如果该消息是单播的,则该消息会出现在两台计算机的 Wireshark 中。
使用数据包发送器笔记本电脑,广播的数据包在两台计算机的Wireshark中均有注册。
Wireshark 没有在台式电脑中记录发出的广播消息,这很奇怪,不是吗?这让我认为问题不在于路由器,而在于电脑本身。
编辑2:
所以我发现了一些有趣的东西。如果我将广播地址从 改为 ,255.255.255.255
它就192.168.0.255
可以正常工作!为什么会这样呢?
答案1
终于找到了我的问题。
我注意到,如果我进行广播192.168.0.255
而不是255.255.255.255
它,它就会起作用。
经过进一步调查,我注意到该ipconfig
命令在我的台式电脑中返回了一堆适配器。
看起来 VirtualBox 安装在我的系统中添加了一堆虚拟适配器。
使用 Wireshark,我确认消息通过了错误的适配器。因此消息没有进入我的 LAN。
在我的笔记本电脑中,我没有任何虚拟适配器,这就是它使用 255.255.255.255 的原因。
为了修复程序中的问题,并使其能够适应不同的 LAN 配置,我没有将 192.168.0.255 硬编码为广播地址。我所做的是循环遍历所有适配器并向每个适配器广播。您需要将广播地址计算为ip_address | ~subnet_mask
。
答案2
https://serverfault.com/questions/219764/255-255-255-255-vs-192-168-1-255
IP 地址 255.255.255.255 有特殊定义。它是零网络或 0.0.0.0 的广播地址,在 Internet 协议标准中代表此网络,即本地网络。根据定义,向此地址的传输受到限制,因为它永远不会由连接本地网络到其他网络的路由器转发。