2016-08-11 19 views
1

私はLinux上で動作するC++サーバアプリケーションを書いています。 iOSクライアントアプリケーションがサーバーとのTCP接続を開き、サーバーが接続でメッセージの送信を開始します。 iOSアプリをバックグラウンドに入れると、ユーザーが別のアプリに切り替えると、アプリはソケットからのデータの読み取りを停止しますが、ソケットはまだiOSで開いています。バッファーウィンドウがいっぱいになるまでサーバーは送信を続け、send()呼び出しでハングします。 呼び出しの前にsend()呼び出しがハングすることを検出する方法はありますか?電話が切れたときに電話を切る方法。タイムアウトを設定しますか?C++ TCPウィンドウがいっぱいになっていますか?

答えて

1

送信ソケットをノンブロッキングモードにすることができます。

ソケットのfcntl()~F_SETFLO_NONBLOCKフラグを使用してください。

ブロッキングソケットsend()を指定しても、要求されたバイト数よりも少ないバイトが書き込まれている可能性があるため、正しく書かれたコードは戻り値をsend()からチェックしているはずです。

ノンブロッキングモードでは、send()はただちに戻り値-1を返し、errnoEAGAINまたはEWOULDBLOCKになります。次に、poll()またはselect()を使用して、ソケットを次回に書き込むことができるかどうかを確認します。

+0

'send()'は直ちにエラー*を返し、-1が返されます。バイトが書き込まれていない場合は-1です。ゼロを返す唯一の方法は、ゼロ長を指定した場合です。 – EJP

+0

ありがとうございました。 –

0

ソケットを非ブロッキングモードにして、EAGAIN/EWOULDBLOCKを検出します。

0

シンプルなselectまたはpollをタイムアウトなしで、シングルソケットを書き込みファイル記述子/ハンドルとして使用できます。

関連する問題