0

PC によって制御される産業プロセスのリモート コントロールとして Android デバイスを使用しています。

接続が予期せず切断されることがあります。バッテリーが切れる、Android デバイスが圏外になる、ネットワークの問題が発生する、ワイヤレス アクセス ポイントがリセットされる、Android が再起動するなどです。このような状況では、PC は切断されたことを「認識」しない可能性があります。 FINを取得しないためです。

したがって、Android 側で再起動し、ソケットを初期化するときに、

sock = new Socket(ipAddress, portNumber);

ネットワーク スニファー (Wireshark) では、Android が SYN を送信していることがわかります。しかし、PC は切断されたことを認識していないため、つまり、以前からまだ接続されていると考えているため、RST、ACK を送信します。これにより、Android Socket コンストラクターが null を返します。

私がする必要があるのは、SYN ではなく FIN を PC に送信することです。しかし、SYN はハンドシェイクの最初のパケットでなければならないと思いました (私はネットワークの専門家ではありません) または、代わりに、SYN で開始しないようにして、何も起こらなかったかのように接続を再利用し始めることができます。それを行う方法はありますか?Android 側からこのデッドロックを打破するにはどうすればよいですか? (私はPCが何をするかを制御できません)

前もって感謝します。

4

1 に答える 1

1

これは、TCP ハンドシェーク スキームが機能する方法の基本的な結果です。これは、リモート エンドから (TCP のルールを破ることなく) 修正できるものではなく、各エンドが処理方法を自分で決定する必要があるものです。

サーバー側では、サーバー ソケットの再利用設定を使用して対処し、タイムアウトを構成し、場合によってはオペレーティング システムのクローズ待機ソケットの数を制限します。

クライアント側では、相手側の存在をどの時点であきらめて最初からやり直すかを決定する必要があります。これは、PC の動作を変更する必要があることを意味する可能性があります。現在のクライアント プログラムは、予想されるネットワーク接続の損失を処理するロジックなしで記述されているように思われるからです。

于 2013-05-17T15:32:55.357 に答える