我实际上尝试了使用 TCP Select 的客户端服务器代码。我不知道为什么在客户端的每个请求都打印在服务器上之后会打印垃圾值
问问题
548 次
1 回答
0
您将服务器上收到的消息视为字符串,但没有从客户端发送 nul 终止符。这会导致旧内容显示在堆栈中,recv_buf
并且可能会在堆栈的更下方显示,因为 printf 扫描内存以查找值为 0 的下一个字节。您可以通过从客户端发送一个 nul 终止符来解决这个问题,方法是更改您的send
调用以在您的信息
send(sockfd, send_buf, strlen(send_buf) + 1, 0);
或者在服务器中通过在接收到消息后添加一个 nul 终止符
recv_buf[nbytes_recvd] = '\0';
[下面保留原始答案,以防您还想从消息中删除换行符。因为那会无意中解决了你的问题。]
“垃圾价值”并没有给我们太多的继续......
猜测一下,这些字符可能是换行符(值为 0x0D 的单个字符)。从fgets 手册页(我的重点)
fgets() 从流中最多读入一个小于 size 的字符并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。如果读取了换行符,则将其存储到缓冲区中。终止空字节 (aq\0aq) 存储在缓冲区中的最后一个字符之后。
您的客户端读取的字符串可能以换行符结尾。如果您不想将其发送到服务器,可以通过添加将其删除
size_t len = strlen(send_buf);
if (len > 0 && send_buf[len-1] == '\n') {
send_buf[len-1] = '\0';
}
fgets
到您的客户,在其对和的调用之间send
。
于 2012-12-12T07:57:17.387 回答