我正在寻找一种方法来打断accept() http://pubs.opengroup.org/onlinepubs/009695399/functions/accept.html调用阻塞套接字。使用信号不是一种选择,因为这意味着在库中,我不想弄乱用户信号。使用select()
是另一种选择, buf 由于各种原因在我的情况下不是很有吸引力。
如果可能的话,最好的方法是将套接字设置为非阻塞模式(使用fcntl() http://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html and O_NONBLOCK
)来自另一个线程,而套接字被阻塞在accept()
称呼。预期的行为是accept()
调用将返回EAGAIN
or EWOULDBLOCK
in errno
.
真的会这样吗?安全吗?便携的?
如果您了解此方法对 Windows 的适用性(您需要使用WSAIoctl() http://msdn.microsoft.com/en-us/library/windows/desktop/ms741621%28v=vs.85%29.aspx and FONBIO http://msdn.microsoft.com/en-us/library/windows/desktop/bb736550%28v=vs.85%29.aspx),我也有兴趣。
不了解 Windows,但 POSIX 保证了您想要的行为:
如果侦听队列中没有连接请求,并且未在套接字的文件描述符上设置 O_NONBLOCK,则accept() 将阻塞,直到存在连接。如果listen()队列中没有连接请求,并且在套接字的文件描述符上设置了O_NONBLOCK,则accept()将失败并将errno设置为[EAGAIN]或[EWOULDBLOCK]。
Source: http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html http://pubs.opengroup.org/onlinepubs/9699919799/functions/accept.html
Also, select
or poll
可用于通过轮询读取集中的侦听套接字来检查传入连接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)