socket网络编程之select模型
2014-03-09 13:53
253 查看
select函数原型:
int select (int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval * timeout);
参数解释:
参数1:最大的文件描述符加1。
参数2:用于检查可读性,
参数3:用于检查可写性,
参数4:用于检测带外数据,
参数五:一个指向timeval结构的指针,用于决定select等待I/o的最长时间。如果为空将一直等待。如果值设置为{0,0},表明select会立即返回。
timeval结构的定义:
struct timeval {
long tv_sec; // seconds
long tv_usec; // microseconds
}
返回值解释:
>0:就绪描述字的正数目
-1:出错
0 :超时
select相关宏:
●
FD_CLR(s, *set):从set中删除套接字s。
● FD_ISSET(s, *set):检查s是否set集合的一名成员;如答案是肯定的是,则返回TRUE。
● FD_SET(s, *set):将套接字s加入集合set。
● FD_ZERO( * set):将set初始化成空集合。
使用步骤:
假定我们想知道是否可从一个套接字中安全地读取数据,同时不会陷于无休止的
“锁定”状态,便可使用 FDSET 宏,将自己的套接字分配给 fdread 集合,再来调用 select。要
想检测自己的套接字是否仍属 fdread 集合的一部分,可使用 FD_ISSET 宏。采用下述步骤,便
可完成用 select 操作一个或多个套接字句柄的全过程:
1) 使用FDZERO宏,初始化一个fdset对象;
2) 使用FDSET宏,将套接字句柄加入到fdset集合中;
3) 调用 select 函数,等待其返回……select 完成后,会返回在所有 fdset 集合中设置的套接字句柄总数,
并对每个集合进行相应的更新。
4) 根据 select的返回值和 FDISSET宏,对 fdset 集合进行检查。
5) 知道了每个集合中“待决”的 I/O操作之后,对 I/O进行处理,
然后返回步骤1 ),继续进行 select 处理。
select
函数返回后,会修改 fdset 结构,删除那些不存在待决 I/O 操作的套接字句柄。
这正是我们在上述的步骤 ( 4 ) 中,为何要使用 FDISSET 宏来判断一个特定的套接字是否仍在集合中的原因。
fd_set结构体解释:
struct
fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件,
当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。
int select (int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval * timeout);
参数解释:
参数1:最大的文件描述符加1。
参数2:用于检查可读性,
参数3:用于检查可写性,
参数4:用于检测带外数据,
参数五:一个指向timeval结构的指针,用于决定select等待I/o的最长时间。如果为空将一直等待。如果值设置为{0,0},表明select会立即返回。
timeval结构的定义:
struct timeval {
long tv_sec; // seconds
long tv_usec; // microseconds
}
返回值解释:
>0:就绪描述字的正数目
-1:出错
0 :超时
select相关宏:
●
FD_CLR(s, *set):从set中删除套接字s。
● FD_ISSET(s, *set):检查s是否set集合的一名成员;如答案是肯定的是,则返回TRUE。
● FD_SET(s, *set):将套接字s加入集合set。
● FD_ZERO( * set):将set初始化成空集合。
使用步骤:
假定我们想知道是否可从一个套接字中安全地读取数据,同时不会陷于无休止的
“锁定”状态,便可使用 FDSET 宏,将自己的套接字分配给 fdread 集合,再来调用 select。要
想检测自己的套接字是否仍属 fdread 集合的一部分,可使用 FD_ISSET 宏。采用下述步骤,便
可完成用 select 操作一个或多个套接字句柄的全过程:
1) 使用FDZERO宏,初始化一个fdset对象;
2) 使用FDSET宏,将套接字句柄加入到fdset集合中;
3) 调用 select 函数,等待其返回……select 完成后,会返回在所有 fdset 集合中设置的套接字句柄总数,
并对每个集合进行相应的更新。
4) 根据 select的返回值和 FDISSET宏,对 fdset 集合进行检查。
5) 知道了每个集合中“待决”的 I/O操作之后,对 I/O进行处理,
然后返回步骤1 ),继续进行 select 处理。
select
函数返回后,会修改 fdset 结构,删除那些不存在待决 I/O 操作的套接字句柄。
这正是我们在上述的步骤 ( 4 ) 中,为何要使用 FDISSET 宏来判断一个特定的套接字是否仍在集合中的原因。
fd_set结构体解释:
struct
fd_set可以理解为一个集合,这个集合中存放的是文件描述符(filedescriptor),即文件句柄,这可以是我们所说的普通意义的文件,
当然Unix下任何设备、管道、FIFO等都是文件形式,全部包括在内,所以毫无疑问一个socket就是一个文件,socket句柄就是一个文件描述符。
相关文章推荐
- python实现select和epoll模型socket网络编程
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信Select模型(多路复用), 实用Socket通信模板。
- [网络编程]_[Socket]_[Socket 阻塞模式(blocking)下的 I/O模型(model) 之 Select 模型(model)初探]
- [网络编程]_[Socket]_[Socket 阻塞模式(blocking)下的 I/O模型(model) 之 Select 模型(model)初探]
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
- 网络编程一:概述、网络模型、TCP\UDP、Socket套接字、UDP发送和接收、UDP聊、阻塞式方法
- Socket编程之OSI网络模型
- windows网络编程之select模型(改进)
- 【win网络编程】socket中的recv阻塞和select的用法
- 网络编程之 Socket的模式(三) --- “Window网络I/O模型”
- SOCKET编程之WSAEventSelect模型
- WIN网络编程-EventSelectServer模型的服务器设计
- 网络编程中的select优化通用C/S模型
- 网络编程之 Socket的模式(三) --- “Window网络I/O模型”
- windows Socket编程之EventSelect网络模型
- 网络编程之 Socket的模式(四) --- “Window网络I/O模型” 续
- 网络编程基础:使用SELECT模型
- select_socket 网络超时编程实例
- Beej网络socket编程指南 1 目录 套接字介绍和网络模型
- 使用socket实现基于select模型的网络聊天室