我正在寻找一种在阻塞套接字上中断accept()
调用的方法。使用信号不是一种选择,因为这意味着在库中,我不想混淆用户信号。使用select()
是另一种选择,因为各种原因因为我的情况不太吸引人。
如果可能的话,可以正常工作的是将套接字设置为非阻塞模式(使用fcntl()
和O_NONBLOCK
)来自另一个线程,而套接字在{{1}上被阻止打电话。预期的行为是accept()
调用将在accept()
中以EAGAIN
或EWOULDBLOCK
返回。
它确实会这样吗?安全吗?便携式?
如果您了解此方法对Windows的适用性(您需要使用WSAIoctl()
和FONBIO
),我也很感兴趣。
答案 0 :(得分:6)
不了解Windows,但POSIX保证了您想要的行为:
如果侦听队列没有连接请求,并且没有在套接字的文件描述符上设置O_NONBLOCK,则accept()将阻塞,直到存在连接。如果listen()队列没有连接请求,并且在套接字的文件描述符上设置了O_NONBLOCK,则accept()将失败并将errno设置为[EAGAIN]或[EWOULDBLOCK]。
来源:http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html
此外,select
或poll
可用于通过轮询读取集中的侦听套接字来检查传入连接。
答案 1 :(得分:0)
在问题中,您的意思是您不想使用选择(或轮询或epoll),这是IO多路复用的最佳方法。我建议您将另一个线程仅用于侦听套接字,但这是一个坏主意!