我想使用select()
监视套接字是否有要读取的数据,但我不想使用非阻塞套接字。那么select()
可以与阻塞套接字一起使用吗?
我正在使用Windows。
答案 0 :(得分:2)
是的,这是select
的整个点。
它会监视套接字上的活动,如果您在不知道数据存在的情况下尝试read
,就会阻止这些活动。最重要的是,它可以监视多个套接字上的活动,除非您在单独的线程中处理每个套接字,否则在阻塞套接字上没有select
就无法做到这一点。同样重要的是,它会告诉您套接字何时准备好读取和/或进行写入;只需调用read
或write
就无法执行此操作。
select
的行为在这些术语中均为documented:
select()
和pselect()
允许程序监视多个文件描述符,等待一个或多个文件描述符为某类I / O操作“准备好”(例如,输入可能) 。 如果可以在不阻塞的情况下执行相应的I / O操作(例如read(2)
),则认为文件描述符已就绪。
当然,您也可以将其与非阻塞套接字一起使用,否则为了“等待”您必须提出read
- sleep
- {{ 1}} - read
- ...循环,由于一些原因,这是次优的。