2017-11-08 87 views
-1

現在、私は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); 
+0

重複した質問ですが、それは私の質問です。 –

+0

「ちょっとした」議論の他に、実際の問題を引き起こしている接続の喪失を検出していませんか? –

+3

あなたはnetstatで自分自身を見て、実際には失われていないので、この方法で接続の損失を検出することはできません。 TCP接続を閉じるには、特定のハンドシェイク(接続された両面間のデータ交換)が必要で、デバイスからバッテリーを取り外すときに、このハンドシェイクは起こりません。だから一方の側は「死んでいる」が、接続は閉じていない。送信せずにデータを読み取るだけの場合、この場合は永久にデータを待つことができます。この記事では、問題を解決するためのさまざまな方法について説明します。https://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html – Evk

答えて

0

は競合状態を作成します。 socket.Writeを呼び出し、例外や切断を処理する方が良いでしょう。

ソケットレイヤーは例外を使用して管理する必要があります。スローされたIOExceptionは内部例外がSocketExceptionに設定されており、タイムアウトやクローズドソケットをリモートで検出するために必要なすべての情報が含まれています

+0

こんにちはムハンマド、私を助けてくれてありがとう。あなたのawnserは私のコメントとどのように違うのですか? "今動作する唯一のオプションは、ソケットにデータを送信しようとしていて、失敗して捕まえられる" –

関連する問題