gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:41:31 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

或者在服务器端收到消息后添加nul终止符

recv_buf[nbytes_recvd] = '\0';

[如果您还想从消息中删除换行符,则保留下面的原始答案。因为这会无意中解决你的问题。]

“垃圾值(value)”并没有给我们太多继续下去的机会......

据猜测,这些字符可能是换行符(值为 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';
}

到您的客户端,在调用 fgetssend 之间。

关于c - 为什么在服务器代码中打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13835096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com