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

时间:2012-10-12 15:06:04

标签: c sockets posix fcntl

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

如果可能的话,可以正常工作的是将套接字设置为非阻塞模式(使用fcntl()O_NONBLOCK)来自另一个线程,而套接字在{{1}上被阻止打电话。预期的行为是accept()调用将在accept()中以EAGAINEWOULDBLOCK返回。

它确实会这样吗?安全吗?便携式?

如果您了解此方法对Windows的适用性(您需要使用WSAIoctl()FONBIO),我也很感兴趣。

2 个答案:

答案 0 :(得分:6)

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

  

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

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

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

答案 1 :(得分:0)

在问题中,您的意思是您不想使用选择(或轮询或epoll),这是IO多路复用的最佳方法。我建议您将另一个线程仅用于侦听套接字,但这是一个坏主意!