我正在尝试在C语言中创建单线程服务器(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
否则一切都很完美。
答案 0 :(得分:15)
资源暂时不可用是EAGAIN,这不是一个真正的错误。这意味着“我现在没有给你答案,你告诉我不要等,所以我在这里回答没问题。”
如果您将侦听套接字设置为非阻塞,则accept
应该在没有客户端尝试连接时将errno设置为该值。您可以使用select
(传统)或poll
等待传入连接(语义等效,更新的界面,首选,除非您需要在没有它的情况下运行某些旧的unix)或epoll
(已优化)对于成千上万的描述符,特定于Linux的系统调用。
当然,您将使用poll
(或任何替代方案)等待侦听套接字或任何数据套接字上的数据。
答案 1 :(得分:0)
也许可以在fnctl
可以工作之后设置accept()
标志。