通过UDPClient广播相同节目的2个实例

时间:2013-01-10 03:00:49

标签: c# .net-3.5 udpclient

我正在使用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服务并玩交通警察......但我正试图保持这种简单和“有限的用户权利”友好。

在我跑掉并尝试使用预定义的系统范围命名管道之前,我以为我在寻求帮助。 :)

1 个答案:

答案 0 :(得分:0)

代码没有任何问题。在我们的测试环境中,我们有一个没有正确打开端口的监控程序。

好事我们浪费了2天追逐红鲱鱼。

谢谢大家。