要求したすべてのバイトの配信を保証send()
しないのはなぜですか?winsock
これはTCPであり、ソケットをブロックしています。
同様に、これは非ブロッキング時に発生します。すべてを送信することをどのように保証できますか?
私はrecv()
同じことをしていることに気づきました。
要求したすべてのバイトの配信を保証send()
しないのはなぜですか?winsock
これはTCPであり、ソケットをブロックしています。
同様に、これは非ブロッキング時に発生します。すべてを送信することをどのように保証できますか?
私はrecv()
同じことをしていることに気づきました。
すべてが送信されなかった場合はsend
、残りの部分をもう一度呼び出してください。ブロックすればすぐにできます。非ブロッキングの場合は、待機するか、ソケット検出方法 ( select
I/O 完了ポートなど) を使用できます。についても同様ですrecv
。ご希望に添えなかった場合は、recv
再度お電話ください。これは、 とが送受信したバイト数を返すrecv
理由の 1 つです。send
send
またはに渡すバイト数recv
は単なる制限です。それよりも少ない数を送信できます (ただし、非ブロッキングでない限り、通常は送信されません)。しかし、それは間違いなくそれよりも少なく受け取ることができます. (OS は、受信するデータの量や受信するタイミングを制御できません。)
TCP が実装されています。ただし、アプリケーション レベルのメッセージを含むアプリケーション プロトコルがある場合、アプリケーションはそれらを実装する必要があります。魔法では起こりません。TCP は、メッセージに「バイトを結合」しません。TCP はメッセージ プロトコルではなく、バイト ストリーム プロトコルです。メッセージが必要な場合は、それらを実装する必要があります。
この動作は「仕様による」ものです。
次の例に示すように、外側のループを使用できます。
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);
}
send
戻り値を介して何を送信できたかを示します。send
すべてのデータを累積的に送信するか、エラーを返すまでループします。