我正在尝试在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
否则一切都完美地运作。"Resource temporarily unavailable"是EAGAIN错误码,但它并不是真正的错误。它的意思是“我现在没有回答你的问题,而你告诉我不要等待,所以我会立即返回而不回答。”
如果您将监听套接字设置为非阻塞模式(就像您似乎正在做的那样),则当没有客户端尝试连接时,accept
应该将errno设置为该值。您可以使用select
(传统方式)或poll
(语义相同的新接口,除非需要在一些没有它的旧unix上运行,否则更受欢迎)或epoll
(对于数千个描述符进行了优化,仅限于Linux系统调用)等系统调用等待传入连接。
当然,您将使用poll
(或任何替代方法)来等待监听套接字或任何数据套接字上的数据。
accept()
之后设置 fnctl
标志可以起作用。