我正在使用 UdpClient 广播我的程序位置,以便中央计算机可以找到它并开始使用它。
效果很好,直到同一台计算机上的 2 个用户同时尝试广播。由于这是一个有效的用例(想想 Windows 终端服务器),我试图找出解决它的最佳方法:
这是我目前正在尝试的代码:
m_UDPClients = new List<UdpClient>();
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
foreach (IPAddress ip in localIPs)
{
string ipStr = ip.ToString();
if (!ipStr.Contains(".")) // I only want readable addresses
continue;
IPEndPoint ipLocalEndPoint = new IPEndPoint(ip, port);
try
{
UdpClient udpClient = new UdpClient();
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(ipLocalEndPoint);
m_UDPClients.Add(udpClient);
}
catch (Exception e)
{
BSSLog.Error(e);
}
}
如果程序的另一个实例已经在运行,则绑定将抛出此异常:
An attempt was made to access a socket in a way forbidden by its access permissions
这个广播只是节目“广告”一些关于如何连接到它的服务的细节;广播每隔几秒发生一次,它的有效载荷可能小于 1k。
我确实尝试根据需要创建和销毁 UDPclients 并接受冲突,但这很丑陋。
所以......问题是:我如何处理同一程序的 30 个实例,它们都试图通过同一台计算机上的同一个 UDP 端口(不监听,只发布有效负载并继续)来宣传自己?
我知道我可以构建一个 Windows 服务并扮演交通警察等......但我试图保持这种简单和“有限用户权限”的友好性。
在我跑掉并尝试使用预定义的系统范围命名管道或其他东西之前,我以为我是在寻求帮助。:)