現在、私はGPRS経由でデバイスからデータを受信する必要があるプロジェクトに取り組んでいます。これらのデバイスは、サーバー上のポートで待機しているTCPサーバーにデータを送信します。私は最初に複数のデバイスを接続することで問題を抱えていましたが、いくつかの研究の後で、私は非同期のアプローチを実装すべきだということを学びました私は今、着信接続をリッスンする1つのTCPソケットを持っています。そして、リクエストが来るとすぐに、これは新しいソケット接続に置かれ、他の接続試行のためにリスニングソケットを解放します。TCPソケットの切断状態を検出する方法
私の挑戦:2台のデバイスでテストしていますが、これらは正常に接続され、データを送信できます。デバイス(バッテリーとSIMを取り外す)をオフにすると、このデバイスが接続されていないことを検出できず、ソケットを閉じます。リスナーのポート上でnetstatを実行しても、私はまだ2つのデバイスが接続 'ESTABLISHED'で表示されています。
私はすべてのリターン「真」様々な例が、様々なソケットポーリングオプションを試してみました。今動作する唯一のオプションは、ソケットにいくつかのデータを送信しようとすることです。失敗すると捕捉され、偽の値が返されます。ソケットにReceiveTimeoutプロパティを設定しても役立ちません。 シング私が試した:
'if(socket.Connected) { socket.Write(...) }
のようなコードを使用して
socket.Poll(1000, SelectMode.SelectWrite); //returns true
socket.Poll(1000, SelectMode.SelectRead); //returns true
socket.Available = 0 (available);
重複した質問ですが、それは私の質問です。 –
「ちょっとした」議論の他に、実際の問題を引き起こしている接続の喪失を検出していませんか? –
あなたはnetstatで自分自身を見て、実際には失われていないので、この方法で接続の損失を検出することはできません。 TCP接続を閉じるには、特定のハンドシェイク(接続された両面間のデータ交換)が必要で、デバイスからバッテリーを取り外すときに、このハンドシェイクは起こりません。だから一方の側は「死んでいる」が、接続は閉じていない。送信せずにデータを読み取るだけの場合、この場合は永久にデータを待つことができます。この記事では、問題を解決するためのさまざまな方法について説明します。https://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html – Evk