1

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

  • 192.168.1.7(无线适配器)
  • 192.168.247.1(虚拟 VMWare 以太网适配器)
  • 169.254.54.231(另一个 VMWare 以太网适配器)

我正在尝试在所有接口上的端口 1900 上设置一个 UDP 套接字侦听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 广播。这可能会“吞下”数据报,以便它们不会被传递到我的进程吗?如果是这样,我能做些什么吗?

谢谢

4

0 回答 0