在具有多个NIC的计算机上,UDPClient多播接收失败

时间:2010-07-05 21:44:11

标签: c# multicast udpclient

我有一台带有多个网卡的计算机 - 而且UDPClient的send方法一直失败。这是代码:

        private static void receiveData()
    {
        recvSock = new UdpClient(PORT);
        //recvSock.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, mainInterface);
        recvSock.JoinMulticastGroup(IPAddress.Parse(IP), 50);

        IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);

        while (true)
        {
            byte[] data = recvSock.Receive(ref iep);

            // Do not include messages from us
            if (myIPs.Contains(iep.Address))
                continue;

            string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
            Console.WriteLine("received: " + stringData);

        }
    }

PORT = 5000和IP = 224.5.6.7所以应该没问题。主要问题是我无法通过recvSock.Receive()行。我看到数据包通过wireshark传入 - 但代码只是不会处理它们......

思考?提前谢谢!

编辑:我可以确认多个NIC导致了问题 - 代码在单个NIC上正常工作。取消注释SetSocketOption行应该允许它使用多个NIC,但它仍然失败....想法?

2 个答案:

答案 0 :(得分:1)

我发现了同样的问题,然后找到了解决方案: UDP: Read data from all network interfaces

基本上Bind()到0.0.0.0不起作用,你必须在每个本地ip地址上使用Bind()和JoinMulticastGroup()。要为这个爱微软。

答案 1 :(得分:0)

接口部分是以下代码中的重要部分:

unsigned long interface;
ip_mreq mreq;

_parseHostname( _description->getInterface(), interface );
mreq.imr_multiaddr.s_addr = _writeAddress.sin_addr.s_addr;
mreq.imr_interface.s_addr = interface;

setsockopt( _readFD, IPPROTO_IP, IP_ADD_MEMBERSHIP,
                (char*)&mreq, sizeof( mreq ));

接口是接收网卡的(单播)IP地址。