1

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

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

4

1 回答 1

0

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

还好我们浪费了 2 天时间去追逐一条红鲱鱼。

谢谢大家。

于 2013-01-10T20:22:34.230 回答