为什么在服务器代码中打印垃圾值

时间:2012-12-12 07:47:42

标签: c sockets client-server

我实际上使用TCP Select尝试了客户端服务器代码。我不知道为什么在客户端的每个请求都打印在服务器上之后打印出垃圾值

这是服务器代码 https://www.dropbox.com/s/qgd87fby6tif9q6/server.c

这是客户端代码 https://www.dropbox.com/s/qlv1im06gfw5i1w/client.c

1 个答案:

答案 0 :(得分:0)

您将服务器上收到的消息视为字符串,但未从客户端发送nul终结符。这导致recv_buf中的旧内容,并且可能在堆栈的下方显示为printf扫描内存以获取值为0的下一个字节。您可以通过更改您{{1来从客户端发送nul终止符来解决此问题调用在消息中包含字符串终结符

send

或在服务器中通过在收到消息后添加nul终结符

send(sockfd, send_buf, strlen(send_buf) + 1, 0);

[如果您还想从邮件中删除换行符,请保留下面的原始答案。因为那无意中解决了你的问题。]

“垃圾价值”并没有让我们继续下去......

猜测,这些字符可能是换行符(值为0x0D的单个字符)。从fgets man page(我的重点)

fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。 如果读取换行符,则会将其存储到缓冲区 。终止空字节(aq \ 0aq)存储在缓冲区中的最后一个字符之后。

您的客户端读取的字符串可能以换行符结尾。如果您不想将其发送到服务器,可以通过添加

将其删除
recv_buf[nbytes_recvd] = '\0';

致客户,致电size_t len = strlen(send_buf); if (len > 0 && send_buf[len-1] == '\n') { send_buf[len-1] = '\0'; } fgets