6

私のコードでは本当に奇妙な状況が起こっています。私はac#チャットクライアントサーバーアプリケーションを開発しています。サーバーを閉じるときに、クライアントを自動的に閉じます。クライアントは、StremReaderを使用してTcpClientオブジェクトから読み取っています。クライアントはwhileループにあり、行(StreamReader.ReadLine())を読み取り、読み取った行を使用していくつかの操作を実行します。サーバーが閉じられると、サーバー側のtcp接続も閉じます。だから、私はクライアントがreadlineによって引き起こされたSocketExceptionを見て、それをキャッチして終了することを期待しています。しかし、例外は捕らえられません!クライアントループコードは次のとおりです。

 while (true)
 {
     try
     {
          ricev = read.ReadLine();
     }
     catch(SocketException exc)
     {
         //It never gets in here
     }
     chat.Invoke(showMessage, ricev);
 }

サーバーを閉じると、Visual Studioから「System.Net.Sockets.SocketException」のファーストチャンス例外がSystem.dllで発生したと表示されますが、キャッチできません。なぜそれが起こるのですか?私はまた、一般的な例外をキャッチしようとしました

catch
{
}

ブロックしますが、それも機能しません。

どんな助けでもありがたいです!

編集:何度か試した後、SocketExceptionがまったく発生しないことが実際にわかりました。コメントで述べたように、これは非常に奇妙なことです。逆の状況では、クライアントがサーバーの前に閉じられると、例外が発生し、それをキャンセルできます。何が起こっているのかよくわかりません。

4

6 に答える 6

1

オブジェクト " " でStopメソッドを呼び出す場合のシナリオをよく理解していれば、ストリームで呼び出したときにクライアント側でスローされません...なぜこれが起こっているのかわかりませんが、その周りに作業場があります. それは、 の基礎となるものにアクセスし、それを呼び出すことによって行われます。TcpListener_server.Stop()SocketExceptionReadSocketTcpListenerShutdown

_server.Stop();
_server.Server.Shutdown(SocketShutdown.Both);//now at your "read.ReadLine();" will throw SocketException

編集:あなたはコメントで述べました:

実際には、accept メソッドでリスナーから返された tcpclient を閉じています。connClient.Close()

tcpListerner" "を停止してから getted fromメソッド_server.Stop()を閉じる場合は、スロー 時に自分でテストしました。clients_server.AcceptTcpCleint()reader.ReadLine()IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall

于 2011-07-12T17:50:08.230 に答える
0

Visual Studioから、System.dllで「System.Net.Sockets.SocketException」のファーストチャンス例外が発生したとのことですが、キャッチできません。なぜそれが起こるのですか?

ファーストチャンス例外はデバッガーによってインターセプトされ、中断されます。catchそれはあなたをあなたのキャッチブロックに入れる2番目のチャンスの例外であり、それがあなたが最初のチャンスであなたのブロックに入らない理由です。詳細については、この記事を参照してください。

上記の記事から抜粋

ファーストチャンス例外は、コードに問題があることを意味しますか?ファーストチャンス例外メッセージは、ほとんどの場合、コードに問題があることを意味するものではありません。例外を適切に処理するアプリケーション/コンポーネントの場合、最初のチャンスの例外メッセージは、例外的な状況が発生して処理されたことを開発者に通知します。

ちなみに、ファーストチャンス例外で停止しないようにデバッガーをいつでも構成できます。

于 2012-07-07T19:03:01.883 に答える
0

を呼び出している場合Invoke、例外が でラップされる可能性がありTargetInvocationExceptionます。

于 2011-07-13T10:40:41.570 に答える
0

サーバー ソケットを閉じると、反対側は 0 バイトのメッセージを受け取ります。これは、サーバーが適切に終了したことを示しています。

リモート ホストが Shutdown メソッドを使用して Socket 接続をシャットダウンし、使用可能なすべてのデータを受信した場合、Receive メソッドはすぐに完了し、0 バイトを返します。

http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx

例外は例外的な状況でのみスローされます。たとえば、クライアントがサーバー コンピューターに接続されているときにサーバー コンピューターを再起動した場合などです。通常のプログラム フローではスローされません。

また、ReadLine()操作は例外をスローするのではなくnull、これが発生したときに単純に戻る必要があります。

戻り値

入力ストリームの次の行、または入力ストリームの最後に達した場合は null。

http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx

于 2013-01-22T13:51:32.140 に答える
-2

これは、.Net が送受信メソッドに安全でないメソッドを使用するためです。プログラムのクーンテキストを処理する必要があります。UnhandledException

于 2012-07-07T18:49:42.870 に答える