TCP/IP网络编程学习笔记(五)
程序员文章站
2022-06-30 18:20:28
...
-
select()
函数解析:int select(int maxfd, fd_set* readset, fd_set* writeset, fd_set* exceptset, const struct timeval* timeout);
-
select()
函数使用步骤:
设置文件描述符;
指定监视范围;
设置超时;
调用select()
函数;
查看调用结果。- 设置文件描述符时,直接使用
FD_SET()
将文件描述符对应的数值设置进fd_set
结构体中即可; - 传给
select()
函数的第一个实参的值一般是文件描述符的数值+1,因为是从0开始的; - 第二个形参表示“是否存在可待读取数据”的文件描述符集合,第三个参数表示“是否可传输无阻塞数据”的文件描述符集合,第四个参数表示“是否发生异常”的文件描述符;
- 发生错误时返回-1,超时返回0,正常返回发生事件的文件描述符数量。注意,由于是阻塞函数,所以可以被信号中断。当被信号中断时,返回-1,且
erro
的值为EINTR
; - 当最后的参数传入nullptr或者0时,表示无限等待。
-
-
一般使用
select()
时,会将传入的fd_set
结构复制一份,因为每次调用完此函数,fd_set
结构中所有未被激发的文件描述符位置都被重置为0,所以要有一份备份留着; -
如果循环调用
select()
,则timeout
结构需要在循环内部设置,因为调用完成后此结构就变了,被替换为超时前剩余时间; -
服务端的socket文件描述符一般存储到
readset
里面,因为客户端的连接请求是通过传输数据完成的,因此,服务端套接字中有接收的数据,就表示有新的连接请求; -
Windows下
select()
函数的第一个参数无任何意义,只是为了与Linux兼容; -
Window下的
fd_set
结构体与Linux下的实现不一致,Linux的文件描述符是从0开始递增的,而Windows下的句柄值并没有规律可循; -
select()
的使用中,一个文件描述符可以同时放到上述三个fd_set
参数中,分别表示当此文件描述符可读取时,可写入时以及有异常发生时的情况。
推荐阅读
-
python网络编程学习笔记(九):数据库客户端 DB-API
-
python网络编程学习笔记(10):webpy框架
-
python网络编程学习笔记(六):Web客户端访问
-
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
-
python网络编程学习笔记(五):socket的一些补充
-
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
-
python网络编程学习笔记(四):域名系统
-
python网络编程学习笔记(三):socket网络服务器
-
python网络编程学习笔记(一)
-
网络编程基础之TCP编程学习(一)