是否可以(并且安全)使接受套接字无阻塞?

我正在寻找一种方法来中断阻塞套接字上的accept()调用。 使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号。 使用select()是另一种选择,因为各种原因buf在我的情况下不是很吸引人。

如果可能,最好的方法是将套接字设置为非阻塞模式(使用fcntl()O_NONBLOCK )来自另一个线程,而套接字在accept()调用时被阻塞。 预期的行为是accept()调用将在errno使用EAGAINEWOULDBLOCK返回。

它真的会这样吗? 安全吗? 便携式?

如果你知道这个方法对Windows的适用性(你需要使用WSAIoctl()FONBIO ),我也很感兴趣。

不知道Windows,但POSIX保证您想要的行为:

如果侦听队列没有连接请求且未在套接字的文件描述符上设置O_NONBLOCK,则accept()将阻塞,直到存在连接。 如果listen()队列没有连接请求并且在套接字的文件描述符上设置了O_NONBLOCK,则accept()将失败并将errno设置为[EAGAIN]或[EWOULDBLOCK]。

资料来源: http : //pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html

此外, selectpoll可用于通过轮询读取集中的侦听套接字来检查传入连接。