5

我有一台带有多个 NIC 的计算机 - UDPClient 的发送方法不断失败。这是代码:

        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 一起工作,但它仍然失败....想法?

4

2 回答 2

1

我有同样的问题找到了这篇文章,然后在以下位置找到了解决方案: UDP:从所有网络接口读取数据

基本上 Bind() 到 0.0.0.0 不起作用,您必须在每个本地 IP 地址上进行 Bind() 和 JoinMulticastGroup() 。一定要为这个爱微软。

于 2013-10-24T14:15:51.317 回答
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地址。

于 2010-07-06T14:09:28.533 回答