2017-06-11 12 views
2

Raspberry Pi3で動作するC++クライアントと、CentOS7とPhp7で動作するReactPHPサーバーとの間でソケットの混乱が発生しています。以下を参照してください。TCPソケットは永続的ですか?

  1. クライアントは、ポート1337
  2. クライアント上でTCP上のTLSを使用してサーバーへのソケット接続がサーバーにデータを書き込むことができる作成されます。
  3. サーバーはクライアントにデータを書き込むことができます。
  4. Tsharkは、ポート1337だけのフィルタを備えた両方のマシンで動作しており、この初期通信を確認します。
  5. 次の1時間は通信が行われず、両方のマシンのTsharkは通信が発生していないことを確認します。
  6. クライアントまたはサーバーのいずれもクローズ接続を受けておらず、接続がまだ開いていると考えます。
  7. サーバはクライアントにもう少しデータを書き込もうとしますが、Tsharkはサーバワイヤ上で送信を見ますが、Tsharkはクライアント側の送信を見ません。クライアントは応答しません。
  8. クライアントデーモンがシャットダウンされると、サーバーは接続が閉じられたことを検出します。
  9. クライアントデーモンの代わりにサーバーデーモンをシャットダウンすると、クライアントは接続が閉じられたことを検出しません。

php.iniはdefault_socket_timeoutが60秒であることを示し、値を変更しても影響はないようです。

これを引き起こしている原因は何ですか。どうすれば防止できますか?

+0

これが見えます。答えに示唆されているようなSO_KEEPALIVEは、非活動状態のために状態を落とすことに役立ちます。 –

答えて

0

はあなたのクライアントソケットのSO_KEEPALIVEオプションを設定しようとした持っていただきありがとうございますか!

ここでは、この仕組みの詳細と、接続が片側でのみ期限切れになる理由について説明します。 http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

使用方法:接続の状態を維持し、いくつかの非アクティブ後に接続の状態を削除します間でいくつかのパケットフィルタ(ファイアウォールやNATルーター)があるよう

char val = 1;  
setsockopt(my_socket, SOL_SOCKET, SO_KEEPALIVE, &val, 1); 
+0

マイケルはいませんが、調査するつもりはありません。ありがとうございました – user1032531

関連する問題