我的系统有3个活动网络接口:

  • 192.168.1.7(无线适配器)

  • 192.168.247.1(虚拟VMWare以太网适配器)

  • 169.254.54.231(另一个VMWare以太网适配器)

我正在尝试在所有接口上设置一个UDP套接字监听端口1900上的SSDP广播,但是我似乎没有收到所有广播数据报,只有一些 .

这是我的代码:

static void Main(string[] args) {
    IPEndPoint broadcastEP =
        new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);

    using (var udp = new UdpClient(broadcastEP.Port)) {
        udp.JoinMulticastGroup(broadcastEP.Address);
        while (true) {
            IPEndPoint remoteEP = null;
            Console.WriteLine("Listening for data on port " + broadcastEP.Port);
            byte[] buffer = udp.Receive(ref remoteEP);
            Console.WriteLine("Received " + buffer.Length + " data bytes from " + remoteEP);
        }
    }   
}

如果我现在从另一个进程发送广播数据报,上面的代码应该把它拿起来,对吧?

但是,当我在另一个进程中执行此代码时,第一个进程将只接收广播,如果它是从192.168.1.7接口发送的 . 如果我从其他接口之一发送广播,则第一个进程根本不会接收它 . 我可以看到广播实际上是在Wireshark发送的......我错过了什么吗?

static void Main(string[] args) {
    var ifs = new IPAddress[] {
            IPAddress.Parse("192.168.1.7"),
            IPAddress.Parse("192.168.247.1"),
            IPAddress.Parse("169.254.54.231")
        };  
    IPEndPoint broadcastEP =
        new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900);

    using (UdpClient cli = new UdpClient(new IPEndPoint(ifs[0], 0))) {
                IPEndPoint ep = new IPEndPoint(broadcastEP.Address, broadcastEP.Port);
                int n = cli.Send(new byte[] { 1, 2, 3, 4 }, 4, ep);
                Console.WriteLine("Sent " + n + " bytes to " + ep);
    }
}

我知道Windows在端口1900上运行一个服务(称为SSDPSRV)侦听SSDP广播 . 这可能会“吞下”数据报,以便它们不会被传送到我的进程吗?如果是这样,我能做些什么吗?

谢谢