【问题标题】:ERROR on accept: Resource temporarily unavailable接受错误:资源暂时不可用
【发布时间】:2025-12-10 15:40:01
【问题描述】:

我正在尝试用 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

否则一切正常。

【问题讨论】:

    标签: c linux sockets


    【解决方案1】:

    暂时不可用的资源是 EAGAIN,这并不是真正的错误。它的意思是“我现在没有答案给你,你告诉我不要等,所以我在这里没有答案。”

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

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

    【讨论】:

    • 感谢您对隐含含义的解释!
    【解决方案2】:

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

    【讨论】:

      最近更新 更多