私は多くのTCP接続を扱うゲーム用のサーバーを作成しています。突然の接続の切断(PCクラッシュ、ゲームプロセスの停止、インターネット接続の切断、改変)に対処する必要があります。私が現在持っている問題は、両方ともIOException
を投げるので、書き込みエラーから読み取りエラーを区別することができないということです。基本的な例外が同じであっても(SocketException
)、唯一の違いはSocket.Send()
とSocket.Receive()
にそれぞれ発生するということだけです。もちろん、例外メッセージを比較することはできますが、システム言語が変更されるとすぐに問題になるでしょう(とにかく、かなり面倒なアプローチになります)。ソケットの書き込みエラーから読み込みエラーを区別する方法を教えてください。
Hresult
を比較しようとしましたが、基本的な例外は同じであるため、Hresult
も同じです。私もgetHashCode()
を試しましたが、これはプレイヤーからプレイヤーに変わります。
これらの2つの状況を区別できる方法はありますか? 明確にするために、接続が予期せず閉じられたTcpClient
にTcpClient.read()
またはTcpClient.write()
を使用した場合の例外について説明します。
[ 'TcpClient'(https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(V = vs.110)の.aspx)タイプがありません。 'read()'と 'write()'関数です。 tcpクライアントの正確なタイプは何ですか? – KernelMode
あなたはsocket.sendとsocket.receiveの両方の周りでIOExceptionを捕まえて、より具体的な詳細を持つ別の例外を再現したり、そこでの接続の喪失を処理することさえできます。 – ajg
また、いくつかの一般的なエラーは、ソケット書き込みの試行でしか見つからないことに注意してください。それは彼らが「書き込み」エラーであることを意味するものではありません。 –