2

私の状況を要約すると、任意の数のクライアントが通信できる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がスローされないようにすることです。

何か案は?

ありがとう!

4

1 に答える 1

2

私はアイデアを得たと思います。クライアントのリストを作成して維持する必要があります。このリストには、クライアントのすべてのエンドポイント (および必要なその他の有用な情報) が含まれます。

その後、「接続された」クライアントにデータ送信が行われますが、他のすべてのまだ「不明な」コンピューターは通常、あなたに「接続」しようとしますIPAddress.Any

于 2012-11-30T07:21:03.047 に答える