【发布时间】:2012-12-12 07:47:41
【问题描述】:
我实际上尝试了使用 TCP Select 的客户端服务器代码。不知道为什么每次客户端的请求都打印到服务端后,会打印垃圾值
【问题讨论】:
-
欢迎来到 SO。这不是用于代码审查的网站,而是用于技术问题和答案的网站,因此请提出更具体的问题。
标签: c sockets client-server
我实际上尝试了使用 TCP Select 的客户端服务器代码。不知道为什么每次客户端的请求都打印到服务端后,会打印垃圾值
【问题讨论】:
标签: c sockets client-server
您将服务器上收到的消息视为字符串,但没有从客户端发送 nul 终止符。这会导致 recv_buf 中的旧内容,并且可能会在堆栈的下方显示为 printf 扫描内存以查找值为 0 的下一个字节。您可以通过将 send 调用更改为从客户端发送 nul 终止符来解决此问题在您的消息中包含字符串终止符
send(sockfd, send_buf, strlen(send_buf) + 1, 0);
或者在服务器收到消息后添加一个nul终止符
recv_buf[nbytes_recvd] = '\0';
[保留下面的原始答案,以防您还想从消息中删除换行符。因为那会无意中解决了你的问题。]
“垃圾价值”并没有给我们太多的继续......
猜测,这些字符可能是换行符(值为 0x0D 的单个字符)。来自fgets man page(我的重点)
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 之间发送给您的客户。
【讨论】: