加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:19:00 所属栏目:百科 来源:网络整理
导读:我看了一遍,找不到解决这个问题的方法.我已经尝试过我能看到的所有组合而没有运气. 基本上,我想选择一个接口,在两台机器上启动UDP客户端和发送/接收消息.当只有一个NIC处于活动状态时,一切正常,但当两个处于活动状态时,它将停止工作.我看过Wireshark并且有一
我看了一遍,找不到解决这个问题的方法.我已经尝试过我能看到的所有组合而没有运气.

基本上,我想选择一个接口,在两台机器上启动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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读