select() 可以与阻塞套接字一起使用吗?

Posted

技术标签:

【中文标题】select() 可以与阻塞套接字一起使用吗?【英文标题】:Can select() be used with blocking sockets? 【发布时间】:2015-02-20 11:23:55 【问题描述】:

我想使用select() 来监控套接字是否有要读取的数据,但我不想使用非阻塞套接字。那么select() 可以与阻塞套接字一起使用吗?

我正在使用 Windows。

【问题讨论】:

大声笑这个问题怎么“不清楚”?你们这些人很奇怪 【参考方案1】:

是的,这是select全部内容

它会监视套接字上的活动,如果您在不知道数据存在的情况下尝试从它们read 时会阻塞。最重要的是,它可以监视 多个 套接字上的活动,如果没有 select 在阻塞套接字上,您将无法做到这一点,除非您在单独的线程中处理每个套接字。同样重要的是,它会告诉您套接字何时准备好读取 和/或 进行写入;简单地调用 readwrite 是不行的。

select 的行为在这些方面甚至是 documented:

select()pselect() 允许程序监视多个文件描述符,等待一个或多个文件描述符为某种 I/O 操作(例如,可能的输入)“准备好”。 如果可以在不阻塞的情况下执行相应的 I/O 操作(例如,read(2)),则认为文件描述符已准备就绪。

当然,您也可以将它与非阻塞套接字一起使用,否则为了“等待”活动,您必须提供read-sleep-read-@987654334 @-... 循环,由于某些原因,这不是最理想的。

【讨论】:

以上是关于select() 可以与阻塞套接字一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

非阻塞套接字轮询与阻塞套接字

非阻塞套接字仍然可以在 OpenSSL 中阻塞吗?

阻塞套接字并选择

C++ winsock服务器中非阻塞模式与异步套接字的区别

java套接字/输出流写入:它们阻塞吗?

有人可以很好地解释非阻塞套接字的“发送”行为吗?