我试着理解从C(Linux)中的socket读取,这只是代码的一部分:
while(success == 0) {
while((n = read(sockfd, buffer, BUFFSIZE, 0)) > 0) {
printf("%s",buffer);
bzero(buffer,BUFFSIZE);
}
success = 1;
printf("###");
}
打印信息,但是三个哈希(###)从不打印?为什么?该程序似乎阻止了read()。这里我只是打印,但我需要做的是缓冲整个消息然后处理它。
答案 0 :(得分:7)
套接字的另一端上的程序不是closing它,也不是shutting down它的写入(这是你的读取),所以你的结局不知道一切都完成了 - 事实上,从逻辑上来说,不会完成,直到另一端说你没有更多东西要读。
通常,您的应用程序级逻辑需要事先知道要读取多少内容,或者在收到某个终结符之前读取,或者另一端正常关闭或关闭套接字。
(非阻塞I / O完全不同于它 - 它允许您在单个线程中有效地从套接字读取时执行其他操作,但它无法解决确定何时完成读取的问题socket,这是你的问题。)
答案 1 :(得分:5)
您需要知道您收到的邮件有多大,并继续阅读,直到您收到整条邮件(阅读只能返回部分邮件)。
do {
nread = read(s, buf, to_read);
if (nread < 0 && errno == EINTR)
continue;
if (nread < 0) {
perror("read");
exit(1);
}
if (nread == 0) {
printf("socket closed");
... do something appropiate ...
... (reconnecting/exiting the loop with an error/...) ...
}
to_read -= nread;
buf += nread;
} while (to_read > 0);
to_read
是您期望读取的字节长度。 buf
有足够的空间。每次阅读后,请相应地更新to_read
和buf
。当然,你应该正确处理错误。
答案 2 :(得分:1)
您现在必须停止从套接字读取,否则套接字将阻止您的程序,直到它收到更多数据。如果您想知道如何创建不阻止程序的套接字,请查看非阻塞套接字。
ief2
答案 3 :(得分:0)
尝试添加\n
。有时不打印非结束线。
答案 4 :(得分:0)
我猜你的while循环永远不会终止,因为读取成功或阻塞。
答案 5 :(得分:0)
只有当n的值为零时,你的while循环才会结束。
您希望read何时返回零值?您发送到此套接字的数据是否满足任何导致读取返回零的条件?