2 つの明らかな間違い:
2 番目の引数には受信データが入力されるため、変更可能 (文字列リテラルの変更は未定義の動作です) であり、要求されたバイトを格納するのに十分な大きさである必要があります。
char buffer[1024] = ""; /* recv() does not null terminate. */
int bytes_read = recv(clientsocket, buffer , 1024, 0);
if (SOCKET_ERROR == bytes_read)
{
/* Failure. */
}
else
{
/* SOME bytes were read. */
}
send()
これにより、文字列リテラル"200"
が格納されている配列の境界を超えてアクセスするため、未定義の動作が発生します。
int bytes_sent = send(s, "200", 3, 0);
if (3 != bytes_sent)
{
/* Failed to send all data. */
}
ソケットへのデータの書き込みとソケットからのデータの読み取りは単なるバイト ストリームであり、メッセージの論理的な概念がないことを覚えておくことが重要です。何らかのアプリケーション定義プロトコルを介して実装する必要があります。例えば:
- 各メッセージのプレフィックスにその長さ (バイト単位) を付け、その後にメッセージの内容を続ける、または
- 各メッセージを改行文字で終了する
recv()
通常、send()
すべてのデータが読み取られるか、すべてのデータが送信されるか、回復不能な障害が発生するまで、ループで使用されます。