私はLinux上で動作するC++サーバアプリケーションを書いています。 iOSクライアントアプリケーションがサーバーとのTCP接続を開き、サーバーが接続でメッセージの送信を開始します。 iOSアプリをバックグラウンドに入れると、ユーザーが別のアプリに切り替えると、アプリはソケットからのデータの読み取りを停止しますが、ソケットはまだiOSで開いています。バッファーウィンドウがいっぱいになるまでサーバーは送信を続け、send()呼び出しでハングします。 呼び出しの前にsend()呼び出しがハングすることを検出する方法はありますか?電話が切れたときに電話を切る方法。タイムアウトを設定しますか?C++ TCPウィンドウがいっぱいになっていますか?
1
A
答えて
1
送信ソケットをノンブロッキングモードにすることができます。
ソケットのfcntl()
~F_SETFL
O_NONBLOCK
フラグを使用してください。
ブロッキングソケットsend()
を指定しても、要求されたバイト数よりも少ないバイトが書き込まれている可能性があるため、正しく書かれたコードは戻り値をsend()
からチェックしているはずです。
ノンブロッキングモードでは、send()
はただちに戻り値-1を返し、errno
はEAGAIN
またはEWOULDBLOCK
になります。次に、poll()
またはselect()
を使用して、ソケットを次回に書き込むことができるかどうかを確認します。
0
ソケットを非ブロッキングモードにして、EAGAIN/EWOULDBLOCK
を検出します。
0
シンプルなselect
またはpoll
をタイムアウトなしで、シングルソケットを書き込みファイル記述子/ハンドルとして使用できます。
関連する問題
- 1. タイマーやウェブブラウザーでメモリがいっぱいになっていますか? c#
- 2. c#listboxがいっぱいでない
- 3. ドッカーディスクがいっぱいになった
- 4. CSSプログレストラッカーがいっぱいになっていません
- 5. アンドロイド:カーソルウィンドウがいっぱいになっている
- 6. メモリがいっぱいになるまでメモリがいっぱいになるまで
- 7. NServiceBusタイムアウトディスパッチャキューにストレステスト中にメッセージがいっぱいになっています
- 8. View Controllerが画面いっぱいになっていません。Xcode
- 9. プライマリファイルグループがいっぱい
- 10. TCP TXバッファがいっぱいになると、boost :: asioはどうなりますか?
- 11. ストレージがいっぱいになるのはなぜですか?
- 12. ドッカーが私のディスクスペースをいっぱいにしています
- 13. ガードビューがいっぱいになるとロードがフリーズします
- 14. 重大なデータがスローされるカーソルウィンドウ:ウィンドウがいっぱいです
- 15. EditTextがいっぱいになるようにします。
- 16. TF30042:データベースがいっぱいです
- 17. アトムソースに構文エラーがいっぱい
- 18. iOSオーディオ録音コールバックでオーディオバッファがいっぱいになっていないのはなぜですか?
- 19. 背景画像全画面いっぱいいっぱいにボディ
- 20. UITableviewcellの幅が画面いっぱいにならない
- 21. データベースサーバーのディスクメモリがいっぱいです
- 22. 接続プールがいっぱいです
- 23. JMSキューがいっぱいです
- 24. HDFSディスクがいっぱいです
- 25. GridBagLayoutコンポーネントはスペースをいっぱいにしていません
- 26. テーブルの行が不要なスペースでいっぱいになってしまいます
- 27. TCPが変わっています
- 28. MySQLテーブルがいっぱい(InnoDB) - エラー#1114
- 29. 古い世代がいっぱいになっていなくても、連続した完全GCです
- 30. 他のテーブルがいっそういっぱいになると、SQLクエリは非常に遅くなります
'send()'は直ちにエラー*を返し、-1が返されます。バイトが書き込まれていない場合は-1です。ゼロを返す唯一の方法は、ゼロ長を指定した場合です。 – EJP
ありがとうございました。 –