16

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

如果可能的话,最有效的方法是从另一个线程将套接字设置为非阻塞模式(使用fcntl()and ),而套接字在调用时被阻塞。预期的行为是调用将返回 with或in 。O_NONBLOCKaccept()accept()EAGAINEWOULDBLOCKerrno

它真的会那样工作吗?安全吗?便携的?

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

4

2 回答 2

11

不了解 Windows,但 POSIX 保证了您想要的行为:

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

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

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

于 2012-10-12T15:09:06.260 回答
0

在问题中,您说您不想使用 select(或 poll 或 epoll),这是 IO 多路复用的最佳方式。我建议您使用另一个线程仅用于侦听套接字,而这是一个坏主意!

于 2020-03-28T21:25:27.400 回答