Nor*_*wap 11 c sockets posix fcntl
我正在寻找一种方法来accept()阻止阻塞套接字上的呼叫.使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号.使用select()是另一种选择,因为各种原因,在我的情况下它不是很吸引人.
如果可能的话,可以正常工作的是将套接字设置为非阻塞模式(使用fcntl()和O_NONBLOCK)来自另一个线程,而套接字在accept()呼叫时被阻止.预期的行为是,accept()调用将返回EAGAIN或EWOULDBLOCK在errno.
它真的会这样吗?安全吗?便携式?
如果你知道这种方法对Windows(你需要使用WSAIoctl()和FONBIO)的适用性,我也很感兴趣.
不知道Windows,但POSIX保证您想要的行为:
如果侦听队列没有连接请求且未在套接字的文件描述符上设置O_NONBLOCK,则accept()将阻塞,直到存在连接.如果listen()队列没有连接请求,并且在套接字的文件描述符上设置了O_NONBLOCK,则accept()将失败并将errno设置为[EAGAIN]或[EWOULDBLOCK].
资料来源:http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html
此外,select或者poll可以用于通过轮询读取集中的侦听套接字来检查传入连接.