0

TCPソケットを介して接続するサーバーと複数のクライアントがあります。サーバーは、一意のデバイスIDを使用して最初に自分自身を登録する接続クライアントをリッスンします。デバイスが最初に登録されると、サーバーはクライアントに小さなメッセージを「生成」します。これにより、クライアントがウェイクアップして別のソースからデータをダウンロードします。

私たちが抱えている問題は、ネットワークがGPRSを介しており、カバレッジの悪いエリアではネットワークがダウンしたり、サービスの品質が低下したりすることがよくあることです。発生しているように見えるのは、クライアント内で、ネットワーク層がドロップした場合でもNetworkStream.Read()呼び出しがブロックされていることです。例外はスローされず、ネットワークが戻っても、呼び出しはデータを検出しないようです。

これには何か理由がありますか?この問題を回避するにはどうすればよいですか?

NetworkStreamは少なくとも例外をスローして、クライアントが接続の再試行段階に入ることができると思っていたでしょう。

4

2 に答える 2

0

必要なのは読み取りタイムアウトです。状況によっては、ピアが実行されていなくても、TCP読み取りが永久にブロックされる可能性があります。

于 2012-09-04T10:01:05.137 に答える
0

NetworkStreamは、あるクライアントと別のクライアント間の接続を検出しません。データをリッスンするだけです。Read()は、データを受信するまでスレッドをブロックします。

代わりに、BeginRead(または.Net 4.5ではReadAsync )の使用を検討してください。スレッドをブロックすることはなく、新しいデータがない状態でタイムアウトした後、ソケットを閉じて新しいソケットを作成し、再開することができます。

于 2012-09-04T08:07:46.807 に答える