C:套接字:无法读取整个服务器响应

标签 c sockets client

我正在用 C 语言编写 IRC 聊天客户端。除了我无法阅读服务器发送的整个答案之外,一切都运行良好。这是代码:

char buffer[2048];
write_on_screen(current_page(), "LOG COMMAND", command);
write(sockfd, command, strlen(command)); //write to socket
bzero(buffer, sizeof(buffer));
read(sockfd, buffer, sizeof(buffer));
write_on_screen(current_page(), "RESPONSE", buffer);
return buffer;

大多数情况下,缓冲区仅包含响应的一部分(小于 2048 字节),而其他时候则不包含任何内容。在这两种情况下,如果我在第一个之后执行另一个 read() ,它会返回我答案的其余部分或另一个小片段(然后我必须执行另一个 read() 再次)。如果我在 write()read() 之间放置 sleep(1) 我会得到完整的答案,但我确信这不是一个很好的做法。 有什么办法可以避免这种情况吗?

提前谢谢

最佳答案

你正在犯常见的错误。如果不将 read()recv() 的结果存储到变量中,就不可能编写正确的网络代码。你必须:

  1. 检查它是否为-1,如果是,则查看errno以查看是否是致命的,除了EAGAIN/EWOULDBLOCK之外,几乎总是致命的,如果是致命的则关闭套接字并放弃进程。
  2. 检查它是否为零,这意味着对等点已断开连接。同样,您必须关闭套接字并放弃该进程。
  3. 将其用作实际接收的字节数。这些函数没有义务也不保证填充缓冲区。它们在阻塞模式下的约定是阻塞直到出现错误、流结束或至少传输一个字节。如果您期望超过一个字节,通常必须循环直到获得它。

关于C:套接字:无法读取整个服务器响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28557733/

相关文章:

python - 'METHODNAME' 作为客户端方法与扭曲的 irc _'METHODNAME'

c - 错误 malloc() : memory corruption

c - C中Struct的恼人问题

接受后配置 TCP keepalive

security - 如何防止基于UDP的 channel 变成 “backdoor”?

android - 为什么服务器/客户端套接字停止工作

c - POSIX 方式将用户输入的 utc 偏移量转换为日历时间

c - 如何读取 IPv6 地址的暂定标志?

linux - 如何增加 linux 上的最大套接字连接数?

node.js - 使用 socket.io-client 发送 cookie