接受连接时出错:资源暂时不可用。

10

我正在尝试在Linux(Red Hat)中使用C语言创建单线程服务器,该服务器将侦听多个套接字。

我需要使用非阻塞套接字,当我像这样设置标志为非阻塞时:

int flagss = fcntl(socketfds[j],F_GETFL,0); 
flagss |= O_NONBLOCK;
fcntl(socketfds[j],F_SETFL,flagss);

我得到:

ERROR on accept: Resource temporarily unavailable
否则一切都完美地运作。
2个回答

21

"Resource temporarily unavailable"是EAGAIN错误码,但它并不是真正的错误。它的意思是“我现在没有回答你的问题,而你告诉我不要等待,所以我会立即返回而不回答。”

如果您将监听套接字设置为非阻塞模式(就像您似乎正在做的那样),则当没有客户端尝试连接时,accept应该将errno设置为该值。您可以使用select(传统方式)或poll(语义相同的新接口,除非需要在一些没有它的旧unix上运行,否则更受欢迎)或epoll(对于数千个描述符进行了优化,仅限于Linux系统调用)等系统调用等待传入连接。

当然,您将使用poll(或任何替代方法)来等待监听套接字或任何数据套接字上的数据。


1
感谢您对隐含意义的解释! - Antoine 'hashar' Musso

0
也许,在 accept() 之后设置 fnctl 标志可以起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接