微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 具有多个NIC的UDP多播仅在一个接口处于活动状态时有效

我看了一遍,找不到解决这个问题的方法.我已经尝试过我能看到的所有组合而没有运气.

基本上,我想选择一个接口,在两台机器上启动UDP客户端和发送/接收消息.当只有一个NIC处于活动状态时,一切正常,但当两个处于活动状态时,它将停止工作.我看过Wireshark并且有一个NIC可以看到进出的数据包.

现在,当我使用两个网卡时,我只能从第一个枚举的网卡中接收TX,并且无法接收任何网卡.当两个NIC都处于活动状态时,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,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);
}

解决方法

迈克G是对的. UDPClient类的一个构造函数将IPEndPoint作为参数.如果IPEndPoint设置为本地接口的IP地址,那么这是UDPClient和底层套接字将使用的接口,是的,只要它们打开,您就可以将两个UDP客户端绑定到一台机器上的同一端口单独的本地IP接口(即多宿主或多NIC).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐