You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向子网内任意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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:54:02