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

Posted

技术标签:

【中文标题】具有多个 NIC 的计算机上的 UDPClient 多播接收失败【英文标题】:UDPClient Multicast receive fails on computer with multiple NICs 【发布时间】:2011-03-12 01:42:33 【问题描述】:

我有一台带有多个 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 一起使用,但它仍然失败....想法?

【问题讨论】:

明确地说,这个“客户端”应用程序 [机器] 有多个 NIC,或者您连接的服务器有多个 NIC?? 由于我有同样的问题,我愿意确认:“客户端应用程序[机器]有多个网卡”。通常,客户端关心位于多个 NIC 网络中的任何一个上的服务器。仅当客户端可以通过多个客户端 NIC 看到相同服务器时,具有多个 NIC 的服务器才重要。 @Dan 你找到解决方法了吗?我也有同样的问题 【参考方案1】:

我有同样的问题找到了这篇文章,然后在以下位置找到了解决方案: UDP: Read data from all network interfaces

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

【讨论】:

【参考方案2】:

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

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地址。

【讨论】:

这个答案可能有用。但由于它使用的术语来自与原始问题完全不同的套接字包,...,谁能说出来? 此答案与给定问题的唯一相关性是它们都包含“IP”一词。

以上是关于具有多个 NIC 的计算机上的 UDPClient 多播接收失败的主要内容,如果未能解决你的问题,请参考以下文章

C#:UdpClient 很快调用 close() 时不发送数据

windows2012的NIC Teaming配置

您如何“取消” UdpClient::BeginReceive?

网卡信息检测与网络流量检测

如何找出哪个端点导致了 SocketException,UdpClient

c - 具有多个客户端的 UDP 客户端-服务器