• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:サーバ、クライアント間でインターネットを介しての通信について)

サーバ、クライアント間での通信における受信不具合の原因と解決方法

このQ&Aのポイント
  • サーバとクライアント間でのインターネット通信中に、クライアントがサーバからのメッセージを受信できないという現象が発生しています。
  • 現象が発生しても通信エラーやコネクションの切断は起こらず、アプリケーションは正常に動作しています。
  • 原因を調査するためには、サーバやクライアントのアプリケーションのエラー処理を確認する必要があります。また、ルータ環境やファイアウォールの設定にも注意が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

> IPマスカレード・テーブル保持時間(10分) 固定 IP なら関係ないかもとは思うけど、NAT 変換してるなら NAT テーブルのタイムアウトという線もある。本当に 10分になってるかとか。

peekpoke
質問者

補足

回答ありがとうございます。 マスカレード期間を10分→300分など色々変えてみましたが、あまり関係なかったみたいです。 投稿後、サーバのコードをいじったりして色々と調べてみましたら サーバからクライアントにメッセージを送信後、3分間ぐらいサーバをスリープしている期間に "tcp xxx.yyy.zzz.aa:55872: connection reset by peer" (xxx.yyy.zzz.aa はサーバのグローバルIPです) 上記エラーが発生し、落ちました。 サーバでlistenしているポートは49152なのに、なぜ55872?? と思いながら netstat -aで対象となるポート(49152)の情報を調べたら、 tcp6 0 0 192.168.1.202%422:55872 s##.GtokyoFL#.vec:49152 ESTABLISHED (#は実際は数字) が表示されました。 うーん。。これを見ただけでは、ちょっと私には分かりません。 たぶん分かる人はすぐ分かるのかな??

その他の回答 (2)

  • noyuo
  • ベストアンサー率39% (33/84)
回答No.2

毎writeの前のselect が成功してしまうなら、アプリレベルのプロトコルで工夫する(回答のダミーのwrite)などが必要かもしれませんね。以前に、CLNP上に構築された他社システムのアプリと通信したことがありますが、送信ごとに再接続が必要かチェック(1バイトごとにSELECT)してからwriteしていました。(相手側のシステムが勝手にdisconnectしてしまい、相手のアプリではconnectを制御できないとのことでしたので)まるで、シリアル通信みたいな制御でした。ちょっと、ご質問の回答になってませんね。すみません。

peekpoke
質問者

補足

回答ありがとうございます。 固定IPが安く使えるL社のプロバイダを利用していて、サーバから送信したメッセージがサーバ側のルータからWAN(L社のプロバイダかも?)の間で消滅してしまっているみたいです。 もう少し調べて見ないとわかりませんが、もしそうだとしたら、noyuoさんのような手法を取らないといけないのかな?とも思っています。

回答No.1

独自プロトコルのソケット通信ってことなんですかね。 select()の戻り値が 0なら タイムアウト ,-1ならエラーなので、 クライアント側でウォッチしてみてはどうでしょう。 なお、タイムアウトが原因なら、select()のタイムアウト指定を延ばすか レスポンスを保留している間(sleep中?)もダミーデータを送受信してやればよいのではないでしょうか。

peekpoke
質問者

補足

回答ありがとうございます。 TCPソケット通信です。 サーバ、クライアントで使われているRead,WriteのTimoutの値はすべて0(無期限)に設定しています。 確かに、ダミーデータを定期的に送受信させていれば、正常な通信は可能になるのですが、 どこが原因なのかを突き止めたいために行っています。

関連するQ&A