如何向子网内任意IP发送UDP广播,实现IP地址通配符匹配?
实现方案说明
首先要明确你的需求分两种场景:接收UDP包时只处理192.168段的来源,或者发送UDP广播到整个192.168.x.x段,两种场景的实现逻辑完全不同。
1. 接收端逻辑修正
你代码中注释掉的IPAddress.Any本身是正确用法,它的作用是监听本机所有网卡的指定端口,所有发到该端口的UDP包都会被捕获,不需要在接收地址里写通配符。如果只要处理192.168段的请求,在收到包后加一层IP判断即可:
private void StartUdpListener() { int listenPort = 替换为你的实际监听端口; UdpClient listener = new UdpClient(listenPort); // 使用Any监听所有网卡 IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); try { while (true) { Console.WriteLine("Waiting for broadcast"); byte[] bytes = listener.Receive(ref groupEP); // 仅处理192.168开头的来源IP byte[] ipBytes = groupEP.Address.GetAddressBytes(); if (ipBytes[0] == 192 && ipBytes[1] == 168) { Console.WriteLine($"Received broadcast from {groupEP} :"); Console.WriteLine($" {Encoding.ASCII.GetString(bytes, 0, bytes.Length)}"); } } } catch (SocketException e) { Console.WriteLine(e); } finally { listener.Close(); } }
之前IPAddress.Any不生效的常见原因:
- 系统防火墙未开放对应UDP端口的入站规则
- 发送端未正确发送广播包
- 多网卡环境下广播包走了其他网段的网卡
2. 发送端广播实现
要向192.168.x.x整个段发广播,不需要通配符地址,直接使用该网段的广播地址192.168.255.255(对应子网掩码255.255.0.0)即可,发送代码示例:
public void SendUdpBroadcast(int sendPort, byte[] sendData) { using UdpClient sender = new UdpClient(); // 开启广播权限,否则无法发送广播包 sender.EnableBroadcast = true; // 192.168.0.0/16段的标准广播地址 IPEndPoint broadcastEndPoint = new IPEndPoint(IPAddress.Parse("192.168.255.255"), sendPort); sender.Send(sendData, sendData.Length, broadcastEndPoint); }
如果你的子网掩码是255.255.255.0,要发当前C段的广播,用对应网段的广播地址即可,比如192.168.0段的广播地址是192.168.0.255。
内容的提问来源于stack exchange,提问作者Stout
相关产品推荐
相关产品推荐

