接收UDP广播数据报

时间:2013-12-08 12:05:36

标签: c# sockets udp udpclient broadcasting

我的系统有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运行一项服务(称为SSDPSRV),侦听端口1900上的SSDP广播。这可能会“吞下”数据报,以便它们不会被传送到我的进程吗?如果是这样,我能做些什么吗?

由于

0 个答案:

没有答案