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 です。

必要に応じてUDPクライアントを作成および破棄し、衝突を受け入れるようにしましたが、それは醜いものでした.

だから...問題は、1台のコンピューターで同じUDPポートを介して自分自身をアドバタイズしようとする同じプログラムの30個のインスタンスをどのように処理するのですか?

Windows サービスを構築したり、交通警官を演じたりできることはわかっていますが、これをシンプルで「限られたユーザー権限」に合わせたものにしようとしています。

逃げ出してシステム全体で定義済みの名前付きパイプか何かを使おうとする前に、私は助けを求められたと思いました。:)

4

1 に答える 1

0

コードに問題はありません。私たちのテスト環境では、ポートを正しく開いていない監視プログラムがありました。

赤いニシンを追いかけて 2 日間を無駄にしたのは良いことです。

みんなありがとう。

于 2013-01-10T20:22:34.230 に答える