我正在用C语言编写我自己的web服务器,我被一个恼人的问题困住了。我在等待这样的连接:
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()成功时,我开始接收以下数据:
errno = 0;
ssize_t r = recv(fd, buf, sizeof(buf), 0);有时候,在使用firefox访问时,我没有收到任何数据。当我将超时设置为1s时,errno设置为EAGAIN。当我将超时设置为5s时,errno将不会被设置,但我仍然没有接收到任何数据r == 0。
是否可以配置套接字,使accept()只在有实际数据可用时才返回?
注意:在使用Chrome访问时,我没有体验到这种行为。
编辑:有人建议我应该使用poll()
当我使用poll()时,我也遇到了同样的问题:
struct pollfd p[] = {{sfd, POLLIN}};
int r = poll(sfd, 1, 1000);
if(r <= 0) err("poll() -> %d", r);r == 1,但我仍然有同样的问题,因为这个poll()只适用于侦听套接字。它不能告诉我在接受的时候是否有实际的有效载荷。
发布于 2021-02-15 11:23:50
您可以使用select、poll或类似的。请参阅:https://stackoverflow.com/a/12862015/4885321
https://stackoverflow.com/questions/66207068
复制相似问题