私の状況を要約すると、任意の数のクライアントが通信できるUDPソケットを開くサーバープログラムを作成しています。次のようなコードを使用してUDPパケットを受信します。
EndPoint sender = new IPEndPoint(IPAddress.Any, 0);
try
{
count = socket.ReceiveFrom(buf, ref sender); // 'count' and 'buf' are defined elsewhere
// If an exception isn't thrown, 'sender' will now contain the EndPoint of the client that sent the packet.
}
catch(SocketException e)
{
if(e.ErrorCode == 10054)
{
// How do I get the EndPoint that caused the error?
// The 'sender' variable above does not contain the EndPoint.
}
}
サーバーが自身のソケットを閉じたクライアントにパケットを送信すると、エラーコード10054(「既存の接続がリモートホストによって強制的に閉じられました」)が表示されます。そのクライアントへのパケットの送信を停止して、SocketExceptionsがスローされないようにします。これにより、サーバーのパフォーマンスが大幅に低下します。
しかし、私の問題は、強制的に閉じられた特定のクライアントのEndPointを取得する方法がわからないことです。(上記の「sender」変数は、例外がスローされる前に有用なものに設定されていません。)そのEndPointを見つけるにはどうすればよいですか?
あまり理想的ではありませんが、それでも実行可能な解決策は、SocketExceptionがスローされないようにすることです。
何か案は?
ありがとう!