我正在用 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,如果是,则查看
errno
以查看是否是致命的,除了EAGAIN/EWOULDBLOCK
之外,几乎总是致命的,如果是致命的则关闭套接字并放弃进程。 - 检查它是否为零,这意味着对等点已断开连接。同样,您必须关闭套接字并放弃该进程。
- 将其用作实际接收的字节数。这些函数没有义务也不保证填充缓冲区。它们在阻塞模式下的约定是阻塞直到出现错误、流结束或至少传输一个字节。如果您期望超过一个字节,通常必须循环直到获得它。
关于C:套接字:无法读取整个服务器响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28557733/