実際にTCP Selectを使ったクライアントサーバーコードを試してみました。クライアントからのすべてのリクエストがサーバーに出力された後にガベージ値が出力される理由がわかりません
これがサーバーコードです https://www.dropbox.com/s/qgd87fby6tif9q6/server.c
これがクライアントコードです https://www.dropbox.com/s/qlv1im06gfw5i1w/client.c
実際にTCP Selectを使ったクライアントサーバーコードを試してみました。クライアントからのすべてのリクエストがサーバーに出力された後にガベージ値が出力される理由がわかりません
これがサーバーコードです https://www.dropbox.com/s/qgd87fby6tif9q6/server.c
これがクライアントコードです https://www.dropbox.com/s/qlv1im06gfw5i1w/client.c
サーバーで受信したメッセージを文字列として扱っていますが、クライアントからヌル ターミネータを送信していません。これにより、printf が値 0 の次のバイトのメモリをスキャンするときに、古いコンテンツrecv_buf
が表示され、スタックのさらに下に表示される可能性がありsend
ます。メッセージ
send(sockfd, send_buf, strlen(send_buf) + 1, 0);
またはサーバーで、メッセージを受信した後にヌル ターミネータを追加します。
recv_buf[nbytes_recvd] = '\0';
[メッセージから改行も削除したい場合に備えて、元の回答を以下に保持します。そして、それはあなたの問題をうっかり解決してしまうからです.]
「ゴミの価値」は、私たちに多くのことを与えてくれません...
推測では、これらの文字は改行 (値が 0x0D の単一文字) である可能性があります。fgets の man ページから(私の強調)
fgets() は、stream から最大で size 未満の 1 文字を読み取り、s が指すバッファーに格納します。EOF または改行の後、読み取りは停止します。改行が読み取られると、 buffer に格納されます。終端のヌル バイト (aq\0aq) は、バッファー内の最後の文字の後に格納されます。
クライアントが読み取る文字列は、改行で終わる場合があります。これをサーバーに送信したくない場合は、追加して削除できます
size_t len = strlen(send_buf);
if (len > 0 && send_buf[len-1] == '\n') {
send_buf[len-1] = '\0';
}
fgets
とへの呼び出しの間に、クライアントに送信しますsend
。