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);
}

UDP多网卡组播只有在一个接口处于活动状态时才能工作

Mike G是正确的。UDPClient类的一个构造函数接受IPEndPoint作为参数。如果IPEndPoint被设置为本地接口的IP地址,那么这就是UDPClient和底层套接字将使用的接口,所以是的,你可以在一台机器上绑定两个UDP客户端到相同的端口,只要它们在单独的本地IP接口上(即多宿主或多网卡)。

我知道这个帖子很老了,但是有同样的问题,我想我还是会贡献的。

在我的"发送者"机器上,我有6个网卡。但是只有1需要能够发送多播消息,所以我从http://sinclairmediatech.com/using-multicast-on-windows-with-multiple-nics/:

使用了这个技巧

我使用的一个小技巧,以确保我得到多播正确的接口。

  1. 以管理员身份打开cmd(右键单击以管理员身份运行)
  2. 删除缺省组播路由。>路由删除224.0.0.0掩码240.0.0.0
  3. 将路由添加到所需的网卡。>路由添加224.0.0.0掩码240.0.0.0 IP_of_NIC

我在windows故障转移集群上遇到了同样的问题…多个网卡…

我最终与微软开了一个案子,因为我认为这是操作系统的问题。

您需要指定要用于创建IPEndpoint的接口的IP。然后在创建套接字时使用该端点而不是IPAddress.any

这就解决了我的问题。

即使晚了也希望能有所帮助。

相关文章: