是否可以(并且安全)使接受套接字无阻塞?
我正在寻找一种方法来中断阻塞套接字上的accept()
调用。 使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号。 使用select()
是另一种选择,因为各种原因buf在我的情况下不是很吸引人。
如果可能,最好的方法是将套接字设置为非阻塞模式(使用fcntl()
和O_NONBLOCK
)来自另一个线程,而套接字在accept()
调用时被阻塞。 预期的行为是accept()
调用将在errno
使用EAGAIN
或EWOULDBLOCK
返回。
它真的会这样吗? 安全吗? 便携式?
如果你知道这个方法对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
可用于通过轮询读取集中的侦听套接字来检查传入连接。