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

Nor*_*wap 11 c sockets posix fcntl

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

如果可能的话,可以正常工作的是将套接字设置为非阻塞模式(使用fcntl()O_NONBLOCK)来自另一个线程,而套接字在accept()呼叫时被阻止.预期的行为是,accept()调用将返回EAGAINEWOULDBLOCKerrno.

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

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

R..*_*R.. 8

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

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

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

此外,select或者poll可以用于通过轮询读取集中的侦听套接字来检查传入连接.

  • 哦,我误解了你的问题.不,我不认为在已经被阻止的情况下将模式更改为非阻塞是可移植的.你为什么不开始使用非阻塞,并在`accept`调用之前使用`poll`或`select`,如果连接可用,只调用`accept`?有很多干净的方法可以让`select`或`poll`尽早返回,比如自我管道技巧. (2认同)