我有一个实现自动发现机制的应用程序,而且我对UdpClient有一个问题。只要打开应用程序的单个实例,它就能正常工作。但是,当第二个实例打开时,第一个实例只接收单播数据包。有趣的是,实现相同机制的类似应用程序似乎没有这个问题。有什么建议吗?
class AutoDiscovery
{
private UdpClient Udp;
private IPEndPoint BroadcastEP = new IPEndPoint(IPAddress.Broadcast, 1234);
private List<byte> AutoDiscoverPacket = new List<byte>();
public ObservableCollection<DiscoveredDevice> DiscoveredDevices = new ObservableCollection<DiscoveredDevice>();
public AutoDiscovery()
{
Udp = new UdpClient();
Udp.ExclusiveAddressUse = false;
Udp.EnableBroadcast = true;
Udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
Udp.Client.Bind(new IPEndPoint(IPAddress.Any, 1234));
AutoDiscoverPacket.AddRange(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
AutoDiscoverPacket.AddRange(Encoding.ASCII.GetBytes("SomeStaticString"));
while (AutoDiscoverPacket.Count < 123)
{
AutoDiscoverPacket.Add(0x00);
}
ReceiveDataAsync(ReceiveDataCallback);
}
~AutoDiscovery()
{
if (Udp != null)
{
try
{
Udp.Close();
}
finally
{
}
}
}
public void Discover()
{
DiscoveredDevices.Clear();
Udp.Send(AutoDiscoverPacket.ToArray(), AutoDiscoverPacket.Count, BroadcastEP);
}
private void ReceiveDataAsync(Action<UdpReceiveResult> Callback)
{
Task.Run(async () =>
{
try
{
while (true)
{
//IPEndPoint object will allow us to read datagrams sent from any source.
UdpReceiveResult receivedResults = await Udp.ReceiveAsync();
Callback(receivedResults);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
});
}
private void ReceiveDataCallback(UdpReceiveResult Result)
{
// Do stuff here
}
}}
发布于 2017-11-02 21:49:35
将多个套接字绑定到相同的IP地址和端口组合是没有用的,在默认情况下甚至是不可能的。只有当您设置SO_REUSEADDR选项(托管代码中的SocketOptionName.ReuseAddress)时,套接字才能在同一个IP地址上共享端口,即使这样做也是不确定的(通常,一个或另一个套接字将接收数据报,而不是同时接收两者)。
如果您可以将套接字配置为使用不同的IP地址(例如,同一台计算机上有多个网络适配器),则它们可以在同一端口上侦听。
不过,更普遍的方法是使用UDP多播。然后,每个服务器都可以加入多播组来接收发现数据报,并使用它们为主通信配置的唯一端口#进行响应。
以下是一些相关的问答:
C# UDP server multiple instances ipv6 same port
Listening to broadcasts when server and client are on the same machine
第二个问题实际上涉及UDP套接字的UWP实现中的一个bug,但问题包括一些关于使用多播来实现这一目标的基本思想的详细信息。
https://stackoverflow.com/questions/47083069
复制相似问题