我正在尝试在C语言的linux(red-hut)中创建单线程服务器,该服务器将监听多个套接字。

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

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

我得到:
ERROR on accept: Resource temporarily unavailable

否则,一切都会正常进行。

最佳答案

资源暂时不可用是EAGAIN,这并不是真正的错误。意思是“我现在没有答案,您已经告诉我不要等待,所以我在返回时没有答案。”

如果您像看起来那样将监听套接字设置为非阻塞,则在没有客户端尝试连接时,accept应该将errno设置为该值。您可以使用select(传统)或poll(等效的,较新的接口(interface),除非需要在没有它的旧Unix上运行,否则首选)或epoll(针对数千个描述符进行了优化,特定于Linux)系统调用,以等待传入连接。

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

关于c - 接受: Resource temporarily unavailable时发生错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7635440/

10-11 18:51