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--;
    }
4

2 に答える 2

5

どういうわけか同期IOと非同期IOを混在させていますが、これは通常少し混乱しますが、ここでは実際的な問題は見られません。

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

select()関数はCの非同期IOのベースであり、ここでそれについて読む必要があります。これは私があなたに役立つと思う例です。

select()は読み取り、書き込み、および例外イベントをサポートしますが、この例は読み取り選択を示しており、書き込み選択を実行する必要があることに注意してください。

于 2012-12-12T14:49:32.183 に答える
1

send()送信されたバイト数またはエラーの場合に返され-1ます。

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

いずれの場合も、送信呼び出しは戻るとすぐに完了します。したがって、非ブロッキング送信が他の場所で完了するのを待つ必要はありません。send()呼び出しが戻った直後に戻り値を確認する必要があります。

于 2012-12-12T14:55:04.010 に答える