2017-07-14 12 views
0

私は多くのTCP接続を扱うゲーム用のサーバーを作成しています。突然の接続の切断(PCクラッシュ、ゲームプロセスの停止、インターネット接続の切断、改変)に対処する必要があります。私が現在持っている問題は、両方ともIOExceptionを投げるので、書き込みエラーから読み取りエラーを区別することができないということです。基本的な例外が同じであっても(SocketException)、唯一の違いはSocket.Send()Socket.Receive()にそれぞれ発生するということだけです。もちろん、例外メッセージを比較することはできますが、システム言語が変更されるとすぐに問題になるでしょう(とにかく、かなり面倒なアプローチになります)。ソケットの書き込みエラーから読み込みエラーを区別する方法を教えてください。

Hresultを比較しようとしましたが、基本的な例外は同じであるため、Hresultも同じです。私もgetHashCode()を試しましたが、これはプレイヤーからプレイヤーに変わります。

これらの2つの状況を区別できる方法はありますか? 明確にするために、接続が予期せず閉じられたTcpClientTcpClient.read()またはTcpClient.write()を使用した場合の例外について説明します。

+0

[ 'TcpClient'(https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(V = vs.110)の.aspx)タイプがありません。 'read()'と 'write()'関数です。 tcpクライアントの正確なタイプは何ですか? – KernelMode

+1

あなたはsocket.sendとsocket.receiveの両方の周りでIOExceptionを捕まえて、より具体的な詳細を持つ別の例外を再現したり、そこでの接続の喪失を処理することさえできます。 – ajg

+0

また、いくつかの一般的なエラーは、ソケット書き込みの試行でしか見つからないことに注意してください。それは彼らが「書き込み」エラーであることを意味するものではありません。 –

答えて

1

あなたは、送信をラップしようとすると、try-catchブロックで関数を受信し、読み取りからの例外を伝えると離れて書くことDataプロパティを使用できます。

enum ReadOrWrite { Read, Write } 

void Foo() 
{ 
    try 
    { 
     socket.Receive(); 
    } 
    catch (IOException ex) 
    { 
     ex.Data.Add("readOrWrite", ReadOrWrite.Read); 
     throw; 
    } 
} 

そして、あなたは後でそれをキャッチ場所です。

try 
{ 
    Foo(); 
} 
catch (IOException ex) when (ex.Data.Contains("readOrWrite")) 
{ 
    var readOrWrite = ex.Data["readOrWrite"]; 
} 
+0

'Socket.Send()'と 'socket.Receive()'は 'TcpClient'クラスの中にあり、私はそれにアクセスできない – LastExceed

+0

NetworkStream.Read/Write 、またはデータを読み書きするために既に使用している方法を使用します。 – AstroRP

関連する問題