UDP多网卡组播只有在一个接口处于活动状态时才能工作
本文关键字:接口 一个 活动状态 工作 网卡 UDP | 更新日期: 2023-09-27 18:04:40
我找遍了也找不到解决这个问题的方法。我试过了我能看到的所有组合,都没有运气。
基本上,我想选择一个接口,在两台机器上启动UDP客户端并发送/接收消息。当只有一个网卡处于活动状态时,一切正常,但是当两个网卡处于活动状态时,它就停止工作了。我用Wireshark看了一下,用一个网卡可以看到进出的数据包。
现在,当我使用两个网卡时,我只能从第一个枚举的网卡发送,而不能在任何一个上接收。当两个网卡都处于活动状态时,WireShark不会显示任何端口上收到的数据包。
代码如下:我以前只有一个插座,但正在尝试一些不同的东西。
public UDPInstance(IPAddress ip, int port, int RXFrequency)
{
rxFreq = RXFrequency;
// Listener Init
TXclient = new UdpClient();
RXclient = new UdpClient();
TXclient.ExclusiveAddressUse = false;
RXclient.ExclusiveAddressUse = false;
//localEp = new IPEndPoint(ip, port);
TXlocalEp = new IPEndPoint(ip, port);
RXlocalEp = new IPEndPoint(IPAddress.Any, port);
TXclient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
RXclient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
TXclient.Client.Bind(TXlocalEp);
RXclient.Client.Bind(RXlocalEp);
InterfaceIP = ip.ToString();
multicastaddress = IPAddress.Parse("239.0.0.222");
TXclient.JoinMulticastGroup(multicastaddress);
RXclient.JoinMulticastGroup(multicastaddress);
// Sender Init
remoteep = new IPEndPoint(multicastaddress, port);
Listener = null;
RXData = new List<string>();
StartListenerThread();
}
public void StartListenerThread()
{
Listener = new Thread(new ThreadStart(ListenerThread));
Listener.IsBackground = true;
Listener.Start();
}
public void StopListenerThread()
{
Listener.Abort();
}
private void ListenerThread()
{
while (true)
{
Byte[] data = RXclient.Receive(ref remoteep);
string datastr = Encoding.Unicode.GetString(data);
if (datastr != "")
{
string[] PacketStrings = datastr.Split(new char[] { '~' });
foreach (string pkt in PacketStrings)
RXData.Add(pkt);
}
Thread.Sleep(rxFreq);
}
}
public void Transmit(string data)
{
byte[] buffer;
buffer = Encoding.Unicode.GetBytes(data);
TXclient.Send(buffer, buffer.Length, remoteep);
}
Mike G是正确的。UDPClient类的一个构造函数接受IPEndPoint作为参数。如果IPEndPoint被设置为本地接口的IP地址,那么这就是UDPClient和底层套接字将使用的接口,所以是的,你可以在一台机器上绑定两个UDP客户端到相同的端口,只要它们在单独的本地IP接口上(即多宿主或多网卡)。
我知道这个帖子很老了,但是有同样的问题,我想我还是会贡献的。
在我的"发送者"机器上,我有6个网卡。但是只有1需要能够发送多播消息,所以我从http://sinclairmediatech.com/using-multicast-on-windows-with-multiple-nics/:
使用了这个技巧我使用的一个小技巧,以确保我得到多播正确的接口。
- 以管理员身份打开cmd(右键单击以管理员身份运行)
- 删除缺省组播路由。>路由删除224.0.0.0掩码240.0.0.0
- 将路由添加到所需的网卡。>路由添加224.0.0.0掩码240.0.0.0 IP_of_NIC
我在windows故障转移集群上遇到了同样的问题…多个网卡…
我最终与微软开了一个案子,因为我认为这是操作系统的问题。
。
您需要指定要用于创建IPEndpoint的接口的IP。然后在创建套接字时使用该端点而不是IPAddress.any
这就解决了我的问题。
即使晚了也希望能有所帮助。