6

TCP データを Mac クライアントに (GCDAsyncSocket 経由で) 送信する EventMachine サーバーがあります。しばらくの間は常に問題なく動作しますが、必然的に、サーバーは接続ごとにデータの送信を突然停止します。接続は引き続き維持され、サーバーは引き続きクライアントからデータを受信しますが、逆方向には進みません。

これが発生すると、connection#get_outbound_data_size を介して、接続送信バッファーが (#send_data を介して) 無限にいっぱいになり、クライアントに送信されていないことがわかりました。

これが発生する可能性がある特定の (そしてできれば修正可能な) 理由はありますか? リアクターはハミングし続け、サーバーへの他のアクティブな接続は正常に動作し続けます (ただし、バッファ地獄に陥ることもあります)。

4

2 に答える 2

0

少なくとも1つの理由がわかります。それは、リモートクライアントがTCP接続の側からデータを読み取らなくなったときです(recv()呼び出しなどを使用)。

次に、シナリオは次のとおりです。クライアント側の受信TCPバッファがいっぱいになります。また、OSはTCPパケットをキューに保存できないため、ピアからのTCPパケットを受け入れることができなくなります。結果として、アプリケーションがソケットでパケットを送信し続けると、サーバー側の送信TCPバッファーもいっぱいになります。send()システムコールが次のようになるため、すぐにサーバーはソケットに書き込むことができなくなります。

  1. 不確定にブロックします。(新しいパケのためにバッファが十分に空になるのを待っています)
  2. otはEWOULDBLOCKエラーで戻ります。(ソケットを非ブロッキングソケットとして構成した場合)

私は通常、クライアント側のコードにブレークポイントを設定したときに、TEST環境でそのようなユースケースに遭遇しました。

于 2012-02-22T13:37:03.963 に答える
0

3月23日にGCDAsyncSocketパッチが適用され、読み取りが停止しないようになりました。このパッチはあなたの問題を解決しましたか?

于 2012-04-09T19:20:08.567 に答える