首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当客户端连接,但不发送数据时,该怎么办?

当客户端连接,但不发送数据时,该怎么办?
EN

Stack Overflow用户
提问于 2021-02-15 11:18:09
回答 2查看 57关注 0票数 0

我正在用C语言编写我自己的web服务器,我被一个恼人的问题困住了。我在等待这样的连接:

代码语言:javascript
复制
struct sockaddr_in caddr;
uint32_t caddr_len = sizeof(caddr);
int fd = accept(sfd, (struct sockaddr *)&caddr, &caddr_len);
if(fd < 0) {
  err(EXIT_FAILURE, "accept()");
}

accept()成功时,我开始接收以下数据:

代码语言:javascript
复制
errno = 0;
ssize_t r = recv(fd, buf, sizeof(buf), 0);

有时候,在使用firefox访问时,我没有收到任何数据。当我将超时设置为1s时,errno设置为EAGAIN。当我将超时设置为5s时,errno将不会被设置,但我仍然没有接收到任何数据r == 0

是否可以配置套接字,使accept()只在有实际数据可用时才返回?

注意:在使用Chrome访问时,我没有体验到这种行为。

编辑:有人建议我应该使用poll()

当我使用poll()时,我也遇到了同样的问题:

代码语言:javascript
复制
struct pollfd p[] = {{sfd, POLLIN}};
int r = poll(sfd, 1, 1000);
if(r <= 0) err("poll() -> %d", r);

r == 1,但我仍然有同样的问题,因为这个poll()只适用于侦听套接字。它不能告诉我在接受的时候是否有实际的有效载荷。

EN

Stack Overflow用户

发布于 2021-02-15 11:23:50

您可以使用selectpoll或类似的。请参阅:https://stackoverflow.com/a/12862015/4885321

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66207068

复制
相关文章

相似问题

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