我有一台带有多个网卡的计算机 - 而且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,但它仍然失败....想法?
答案 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地址。