网络编程学习笔记—select模型
前言
在tcp的c/s模型中,一个服务器只能与一个客户端进行链接、通信,但是在实际应用中,一个服务器往往需要与多个客户端链接。select模型可以实现多个客户端的链接,与多个客户分别通信。select优化的是服务器,
提示:以下是本篇文章正文内容,下面案例可供参考
一、select模型逻辑
图一 select服务器模型流程图
- 每个客户端都有socket,服务器也会有自己socket。在select模型中,服务器有两种类型的socket,一个是监听套接字接口,一个是已连接套接字接口。当多个客户端与服务器链接的时候,服务器会监听套接字接口跟已连接套接字接口装进数组中。
- 通过select函数,遍历socket的数组,当某一个socket有响应,我们可以通过select函数的函数值/返回值反馈出来。
- 相应处理:若是检测到服务器socket,那就是有客户端链接,此时调用accept(),接受链接;若是检测到客户端socket,那就是客户端请求通信,此时调用send()或recv()。
二、fd_set的结构和意义
typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;
// u_int fd_count; //数组元素的实际大小
//SOCKET fd_array[FD_SETSIZE];//socket类型数组,用来存放socket,数组大小为FD_SETSIZE 64
说明
- 这是在windows系统中关于fd_set的定义
- 在select()函数中,就有一个参数的类型是fd_set,fd_set是服务于select()函数的
- FD_SETSIZE是一个宏,那就说明我们可以定义它的大小,系统默认是64
- 自定义FD_SETSIZE的大小是,定义要放在<winsock2.h>前面,原因是FD_SETSIZE是在<winsock2.h>中定义的,<winsock2.h>中写有避免FD_SETSIZE被重复定义的语句
三、四个操作fd_set的参数宏
FD_ZERO (&clientSet)
//将结合清零
FD_SET (socket,&setRead)
//向集合中添加一个socket
FD_CLR (socket,&setRead)
//指定删除集合中的socket
FD_ISSET (socket,&setRead)
//判断一个socket是否在集合中
说明
- 这四个操作都是宏,是带参数的宏,带参数的宏不常见,转定义就可以看到对应的结构
四、select()函数原型及用法
/***下面是windows中,给出的select函数原型***/
#if INCL_WINSOCK_API_PROTOTYPES
WINSOCK_API_LINKAGE
int
WSAAPI
select(
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR *exceptfds,
const struct timeval FAR * timeout
);
#endif // INCL_WINSOCK_API_PROTOTYPES
- 参数1 可忽略,填0即可,这个参数是为了兼容Berkeley socket
- 参数2 检查是否有可读socket,
- 参数3 检查是否有可写socket
- 参数4 检查socket上的异常情况
- 参数5 最大等待时间
声明
因为个人能力有限,若是文章中出现不妥之处,可以在评论中留言,或是私信给我,我一定会认真改进。若是文章能帮到各位,不胜荣幸。文章会一直维护哦。。。