0

要件 (変更できません)

Windowsフォームアプリケーションがあります。このアプリケーションを実行すると、UDPポートをリッスンします。

ユーザーは、Windowsにログインして同じアプリケーションを開いて実行し、ログアウトせずにWindowsユーザーを切り替えて、同じアプリケーションを開いて実行することができます。

問題

2つのアプリケーションは、を使用して同じポートをリッスンしています

SocketOptionName.ReuseAddress

このスレッドに示されているように。ただし、データを取得できるのは1人だけです。

質問

別のユーザーのアプリケーションがデータを読み取ることができるようにする方法はありますか?それ以外の場合、Windowsユーザースイッチについて通知するイベントをなんとかして聞くことができますか?

編集

リスナーの設定に使用されるコードは次のとおりです

IPEndPoint localEndPoint = new IPEndPoint(localAddress, listenPort);
UdpClient udpListener = new UdpClient();
udpListener.ExclusiveAddressUse = false;
udpListener.Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress, true);

udpListener.Client.Bind(localEndPoint);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);
byte[] answer = udpListener.Receive(ref ep);
4

1 に答える 1

1

1つのオプションは、ブロードキャスト/マルチキャスト設計に切り替えることです。これは、まったく同じデータグラムを複数のソケットに送信できるようにする唯一の直接的な方法です。

または、マスター/クライアントの設計に移動します。ポートにバインドしてみてください。できれば、素晴らしい、あなたはマスターです。失敗した場合は、マスターがあるかどうかを確認して接続します。

マスターがクライアントとの通信に使用する2番目のポートを選択します。このロジックに従ってください。

  1. ポートを開いてみてください。あなたが成功した場合、あなたはマスターです。マスターポートでもリッスンします。

  2. 失敗した場合は、ランダムなポートを開きます。「クライアントの登録」データグラムをマスターに送信します。

  3. マスターは、マスター/クライアントポートで「クライアントの登録」データグラムをリッスンする必要があります。受信した場合は、送信元IPとポートをクライアントのリストに追加する必要があります。メインポートで受信したすべてのデータグラムを各クライアントに繰り返す必要があります。

  4. 非マスターは、定義された間隔で「クライアントの登録」データグラムを繰り返す必要があります。マスターは、「クライアントの登録」データグラムを十分な長さ、たとえば定義された間隔の2倍で送信していないクライアントをドロップする必要があります。

醜いビット-マスターが終了する可能性がある場合、一部のクライアントは自分自身をマスターに昇格させる必要があります。マシン上で実行できる場合は、専用のマスターを使用することをお勧めします。

于 2013-02-06T13:04:35.510 に答える