我正在使用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);
}
}
如果程序的另一个实例已经运行,bind将抛出此异常:
An attempt was made to access a socket in a way forbidden by its access permissions
这个广播只是节目'广告'有关如何连接到它的服务的一些细节;广播每隔几秒发生一次,它的有效载荷可能是&lt; 1K。
我确实尝试根据需要创建和销毁UDP客户端并接受碰撞,但这很难看。
所以......问题是:我如何处理同一程序的30个实例都试图通过相同的UDP端口(没有监听,只是发布有效载荷并继续)在一台计算机上做广告?
我知道我可以建立一个Windows服务并玩交通警察......但我正试图保持这种简单和“有限的用户权利”友好。
在我跑掉并尝试使用预定义的系统范围命名管道之前,我以为我在寻求帮助。 :)
答案 0 :(得分:0)
代码没有任何问题。在我们的测试环境中,我们有一个没有正确打开端口的监控程序。
好事我们浪费了2天追逐红鲱鱼。
谢谢大家。