gpt4 book ai didi

c# - 具有多个 NIC 的 UDP 多播仅在一个接口(interface)处于事件状态时才有效

转载 作者:行者123 更新时间:2023-11-30 12:34:35 27 4
gpt4 key购买 nike

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

基本上,我想选择一个接口(interface),在两台机器上启动一个 UDP 客户端并发送/接收消息。当只有一个 NIC 处于事件状态时一切正常,但是当两个 NIC 处于事件状态时,它就会停止工作。我查看了 Wireshark,使用一个 NIC 可以看到进出的数据包。

现在,当我使用两个 NIC 时,我只能从第一个枚举的 NIC 发送,而不能在任何一个上接收。当两个 NIC 都处于事件状态时,WireShark 不会在端口上显示任何接收到的数据包。

代码如下。我过去只有一个 socket ,但正在尝试一些不同的东西。

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 设置为本地接口(interface)的 IP 地址,那么这就是 UDPClient 和底层套接字将使用的接口(interface),所以是的,你可以将两个 UDP 客户端绑定(bind)到一台机器上的同一个端口,只要它们在单独的本地 IP 接口(interface)(即多宿主或多 NIC)。

关于c# - 具有多个 NIC 的 UDP 多播仅在一个接口(interface)处于事件状态时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6976526/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com