1

私はclien-server.netアプリを持っています、それらはtcpを介して通信します。サーバーは生のバイトパケットを定期的にクライアントに送信します。

99.9%の確率でうまく機能しますが、クライアントの1つがクラッシュすると(年に2回、それ以上ではない)、サーバーがハングすることがあります。

私はそれをデバッグしました(私のアプリをクラッシュさせるいくつかのテストコードをクライアントに追加することによって)、そして問題がにあることに気づきましたstream.Write(bytes, 0, bytes.Length);。単純なことは何もせず、応答も戻りもせず、ただハングします。ストリームはNetworkStreamです。

前に確認stream.CanWriteしましたが、trueと応答します。

では、クライアントの1つがクラッシュしたことをサーバー側で確認するにはどうすればよいですか?他のクライアントにデータを送信する前に、NetworkStream(または他の何か)で何を確認する必要がありますか?

4

2 に答える 2

3

TCP接続のソケットにタイムアウトを設定します。今は無限のように見えるので、サーバーは死んだクライアントからの応答を無期限に待ちます。

于 2013-03-27T13:22:57.097 に答える
1

反対側がソケットから読み取っておらず、OSソケットバッファがいっぱいであるという理由だけで書き込みがハングする場合があります(ただし、ソケットを閉じておらず、誤った状態でもありません)。

このようなシナリオの説明は次のとおりです。http: //stringarray.net/?p = 29

于 2013-04-06T15:58:11.367 に答える