【发布时间】:2020-01-12 00:17:30
【问题描述】:
我正在尝试使用 C# 中的 UDP 客户端在网络中发送广播消息,但我没有看到网络中任何侦听器客户端收到的消息,我该如何排除故障?
我正在尝试与未知 IP(微控制器设备)/PC 通信,因此我在 UDP 广播上使用广播专有消息。我需要获取远程设备静态 IP,因此我正在使用广播。
发件人代码
IPAddress broadcast = null;
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
s.EnableBroadcast = true;
// proprietary message for identification
byte[] sendbuf = {0x5C, 0x45, 0x6D, 0x62, 0x65, 0x64,
0x4C, 0x6F, 0x67, 0x69, 0x6B, 0x5, 0x6C, 0x73, 0x74, 0x5, 0x4, 0x5};
broadcast = IPAddress.Parse("255.255.255.255");
IPEndPoint ep = new IPEndPoint(broadcast, 1110);
s.SendTo(sendbuf, ep); // send message
我使用 Microsoft 站点的代码并将 IP 修改为 255.255.255.255,但是当我使用 IP 192.168.2.255(路由器 IP 192.168.2.1)时,设备(基于微控制器的设备)会响应,我还检查了 UDP网络中另一台 PC 上的侦听器,但当 ip 设置为 255.255.255.255 进行广播时,我没有在wireshark 上看到侦听器接收(另一台 PC)消息。 为了进行实验,我关闭了路由器并连接了 PC(发送器)和 PC(监听器)以进行切换,但监听器没有收到任何消息。
当我将设备(微控制器设备)直接连接到 PC 时,它可以在 255.255.255.255 和 192.168.2.255 上运行。我不明白当设备在网络中时如何排除故障以及为什么广播在网络中不起作用。
需要帮助来解决这个问题吗?如有任何不清楚的地方请通知
编辑 1: 我将代码从微控制器更改为输出 sendto(255.255.255.255) 现在,当我使用定向广播 (192.168.2.255) 时,我可以在 Wire Shark 上看到来自应用程序的传出消息以及到应用程序的传入消息(来自 MCU (255.255.255.255))
但是当我在应用程序上使用 IP 255.255.255.255 发送消息时,我没有看到在线鲨鱼上的任何数据包。
Edit2:但是我相信是 C# 或 windows 阻止了 UDP 广播,我在 Win7 和 win10 上尝试了该应用程序。
【问题讨论】:
-
您的路由器可能会阻止广播包。当路由器接收到一个数据包时,它会被检查,然后转发到适当的接口,否则就会被丢弃。当路由器接收到广播数据包时,它会丢弃它(不包括定向广播、dhcp 等)。
-
@PabloRecalde 嗨 pablo 感谢您的回复,我也尝试不使用路由器,我关闭路由器的电源,而不是仅连接交换机和 PC 和设备,PC 切换和设备切换。然后它也失败了
-
当心一些开关也会阻止广播
-
我的意思是开关*
标签: c# sockets udp desktop-application broadcast