【发布时间】:2015-02-17 08:36:01
【问题描述】:
我正在用 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()来自套接字的返回不一定像告诉读取的那样多。这是根据定义。仔细阅读文档:man 3 read或man recv。 -
一个套接字是一个流,但是数据是以数据包的形式发送的。这意味着它可以分段到达。如果你想创建一个聊天服务器,你需要异步处理读写。您可以使用
select(或epoll,如果您的目标环境仅限于 Linux)和非阻塞 I/O 在一个线程中执行此操作,或者您可以为每个传入连接设置一个线程,一个用于发送和使用阻塞IO。