首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >recv()不等待数据

recv()不等待数据
EN

Stack Overflow用户
提问于 2022-02-10 21:52:48
回答 1查看 210关注 0票数 0

在用于套接字通信的while(1)循环的第一次迭代中,一切正常--在第二次迭代中,即使连接仍然处于打开状态并正在进行(服务器的send()等待用户在这个套接字上插入数据),来自客户端的recv()无法等待数据。

代码语言:javascript
复制
while(1)
                memset(buffer, 0, 300);
                int nRet = recv(sock, buffer, 299, 0);
                printf("Recv: %d\n", nRet);
                if(nRet < 0)
                    fprintf(stderr, "recv() failed.");
                else if(nRet == 0)
                    continue;
                else
                    fprintf(stdout, buffer);

这是循环的开始,这是值得关注的。在第二次迭代中,输出是"Recv: 0“的无限打印。在我看来,这似乎是不合逻辑的-- recv()应该等到数据被发送,而服务器没有发送数据。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 23:45:56

在我的Linux系统的手册页上,

当流套接字对等端执行有序关闭时,返回值将为0(传统的“文件结束”返回)。

各种域(例如UNIX和Internet域)中的数据报套接字允许零长度的数据报.当收到这样的数据报时,返回值为0。

如果请求从流套接字接收的字节数为0,也可以返回值0。

所以要么连接关闭了,要么你收到了一个0字节的数据报.无止境的重复暗示着前者。反复尝试从关闭的连接读取不会神奇地重新打开它。

它不是一个错误。

这些调用返回接收到的字节数,如果发生错误则返回-1。如果发生错误,将errno设置为指示错误。

信号中断导致误差EINTR。如果套接字是非阻塞的,而没有可用的,则会导致错误EAGAINEWOULDBLOCK。你没有经历过这两件事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71072727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档