1

はっきりさせておきます。私はTCPを使用しています。これは、閉じているかネットワークの問題が原因でない限り、接続が中断されないことを意味します。

だからここに私の問題があります:

私のソケットを利用することは完全に機能します。

5〜10分間操作がないと、応答が停止します(接続はまだ有効です[netstat -nで確認])。

データが送信されていることがわかります(ただし、相手側はデータを受信して​​いないため、データを待機していると確信しています)。

送信を続けると、最終的にWSA​​エラー10038(無効なソケットハンドル)が発生します。

さらに数回送信を試みた後、編集するとエラー10058が発生しました(確立された接続がホストマシンのソフトウェアによって中止されました。)

私は完全に混乱しています。私はソケットを閉じたり、非アクティブ以外のことは何もしていません。10〜20分間ノンストップで使用すると、完全に機能します。

4

2 に答える 2

3

エラー10058の場合、ゲートウェイ(プロキシ、ファイアウォール、またはルーター、NATの有無にかかわらず)が接続のリレーをタイムアウトしていることは事実上確実です。

基本的に、あなたはあなたの仲間と直接つながっていません。代わりに、ゲートウェイはその間にあり、ユーザーとの接続とピアとの接続の間でデータを明示的に転送します。ソケットは限られたリソースであるため、ゲートウェイには、非アクティブな接続のように見えるものをシャットダウンするエビクションポリシーがあります。あなたが死んでいるように見えるなら、ブーム、あなたは死んでいます。

唯一のオプションは、アクティブな状態を維持することです。これは通常、アプリケーションプロトコルに何らかの「ハートビート」で作業することを意味します。厄介ですが、それは休憩です。

自分が何をしているのかを本当に理解していない限り、TCPのSO_KEEPALIVEをいじっ てはいけません。

于 2012-12-26T19:21:20.213 に答える
1

NATファイアウォールが、通知なしに接続を食いつぶしている可能性があります。TCPキープアライブを有効にしてみてください。

于 2012-12-26T18:20:10.277 に答える