2012-12-12 21 views
5

1つのソケットで1つのノンブロッキング送信コールを行い、次に別のソケットでブロック受信を行います。その後、ノンブロッキング送信が成功したか失敗したかをチェックしたいと思います。これはどうすればできますか?ノンブロッキングセンドが成功したかどうかを確認します。

while (i) 
    { 
     retval = send (out_sd, s_message, strlen (s_message), MSG_DONTWAIT); 
     retval = recv (client_sd, r_message, MSG_LEN, 0); 
     r_message[retval] = '\0'; 
     /* Here I want to wait for the non-blocking send to complete */ 
     strcpy (s_message, r_message); 
     strcpy (r_message, ""); 
     i--; 
    } 
+0

コールバックを使用することはできますか? – andre

+1

私はそうは思わない。次の反復に入る前に、メッセージの送信が失敗したか、成功したか、またはキューに入れられたかどうかを確認するだけです。 – phoxis

+0

2つの異なるvar/sを使用してsend/recvの結果を保存します。 – alk

答えて

5

あなたは何とか正常に少し混乱している、同期および非同期IOを混合しているが、私はここで任意の実用上の問題が表示されません。

ハードポーリング(ループでの操作が終了したかどうかを調べる)を避けるには、select()を使用してチャネル/ソケットがより多くの書き込み操作に使用できるようになるまで待機する必要があります。これは、以前のものが終了した(または、それがあなたのOSによって完全に担当されたことを伝えます。これは同じです)。

Cでの非同期IOの基本はselect()関数です。hereで読んでください。thisは役に立つと思う例です。

select()は読み取り、書き込み、例外イベントをサポートしていますが、この例では読み取り選択を示しています。書き込み選択を行いたいとします。

+0

はい私は、同期と非同期のI/Oが混在していますが、異なるソケットで、これは問題なく動作すると思います。すべてのプロセスがこのコードを実行します。したがって、両方がブロックされている場合、デッドロックが発生します。したがって、私は最初にメッセージを送信してから、受信を待っています。 1つのプロセスがデータを受信した後、次の反復に入る前に、最後の非ブロッキング送信が成功したかどうかを確認する必要があります。 – phoxis

+1

詳細は分かりませんが、両方のソケットが同じ2つのプログラムを接続している場合は、同期呼び出しだけでは問題ありませんか?プログラムAはREAD - > WRITE - > READ - >などを実行し、プログラムBはWRITE - > READ - > WRITE - >などを実行します。これは通常行われる処理であり、デッドロックはありません。 –

+0

はい、読み書きを交互に行う可能性がありますが、そのようなことは避けたいです。 – phoxis

1

send()エラーが発生した場合は、送信されたバイト数または-1が返されます。

メッセージから少なくともいくつかのバイトを送信するのに十分なバッファがネットワークスタックにある場合、送信するバイト数はretvalになります。これは送信したいバイト数よりも小さい場合があります。ネットワークスタックバッファがいっぱいになると、-1errnoが含まれ、EAGAINまたはEWOULDBLOCKに設定されます。

すべての場合、送信コールは返されるとすぐに完了します。したがって、非ブロック送信が他の場所で完了するのを待つ必要はないので、send()呼び出しが戻った直後に戻り値を確認する必要があります。

関連する問題