3

要求したすべてのバイトの配信を保証send()しないのはなぜですか?winsock

これはTCPであり、ソケットをブロックしています。

同様に、これは非ブロッキング時に発生します。すべてを送信することをどのように保証できますか?

私はrecv()同じことをしていることに気づきました。

4

3 に答える 3

7

すべてが送信されなかった場合はsend、残りの部分をもう一度呼び出してください。ブロックすればすぐにできます。非ブロッキングの場合は、待機するか、ソケット検出方法 ( selectI/O 完了ポートなど) を使用できます。についても同様ですrecv。ご希望に添えなかった場合は、recv再度お電話ください。これは、 とが送受信したバイト数を返すrecv理由の 1 つです。send

sendまたはに渡すバイト数recvは単なる制限です。それよりも少ない数を送信できます (ただし、非ブロッキングでない限り、通常は送信されません)。しかし、それは間違いなくそれよりも少なく受け取ることができます. (OS は、受信するデータの量や受信するタイミングを制御できません。)

TCP が実装されています。ただし、アプリケーション レベルのメッセージを含むアプリケーション プロトコルがある場合、アプリケーションはそれらを実装する必要があります。魔法では起こりません。TCP は、メッセージに「バイトを結合」しません。TCP はメッセージ プロトコルではなく、バイト ストリーム プロトコルです。メッセージが必要な場合は、それらを実装する必要があります。

于 2013-01-18T13:11:03.810 に答える
5

この動作は「仕様による」ものです。

次の例に示すように、外側のループを使用できます。

int sendBuffer (SOCKET ClientSocket, const char *buf, int len, int flags) 
  {
    int num_left = len;
    int num_sent;
    int err = 0;
    const char *cp = buf;

    while (num_left > 0) 
      {
        num_sent = send(ClientSocket, cp, num_left, flags);

        if (num_sent < 0) 
          {
            err = SOCKET_ERROR;
            break;
          }

        assert(num_sent <= num_left);

        num_left -= num_sent;
        cp += num_sent;
      }

    return (err == SOCKET_ERROR ?  SOCKET_ERROR : len);
  }
于 2013-01-18T13:17:59.730 に答える
0

send戻り値を介して何を送信できたかを示します。sendすべてのデータを累積的に送信するか、エラーを返すまでループします。

于 2013-01-18T13:13:03.763 に答える