【问题标题】:Why is garbage value printing in server code [closed]为什么在服务器代码中打印垃圾值[关闭]
【发布时间】:2012-12-12 07:47:41
【问题描述】:

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

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

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

【问题讨论】:

  • 欢迎来到 SO。这不是用于代码审查的网站,而是用于技术问题和答案的网站,因此请提出更具体的问题。

标签: c sockets client-server


【解决方案1】:

您将服务器上收到的消息视为字符串,但没有从客户端发送 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';
}

在调用fgetssend 之间发送给您的客户。

【讨论】:

  • dropbox.com/s/1jp57eo8ppele91/… 正如您在显示“1234”垃圾值后的屏幕截图中看到的那样......所以我想删除那个垃圾值!!!
  • @sam_3191 好的,我知道现在有什么问题了。我已经更新了答案
  • @simoc 非常感谢......它运行完美。我还有一个问题。现在我想将我从服务器返回的字符串发送给客户端。这种情况我该怎么办!!
  • @sam_3191 很高兴为您提供帮助。您可以将您的新查询作为新问题发布吗?这个网站最适合每个帖子一个问题。另外,如果您对此作为答案感到满意,您是否可以考虑接受它(通过选择我帖子左侧的勾号/复选标记的轮廓)
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2013-09-04
  • 1970-01-01
相关资源
最近更新 更多