网络编程学习笔记

网络编程学习笔记—select模型


前言

        在tcp的c/s模型中,一个服务器只能与一个客户端进行链接、通信,但是在实际应用中,一个服务器往往需要与多个客户端链接。select模型可以实现多个客户端的链接,与多个客户分别通信。select优化的是服务器,
提示:以下是本篇文章正文内容,下面案例可供参考

一、select模型逻辑

在这里插入图片描述

图一 select服务器模型流程图

  1. 每个客户端都有socket,服务器也会有自己socket。在select模型中,服务器有两种类型的socket,一个是监听套接字接口,一个是已连接套接字接口。当多个客户端与服务器链接的时候,服务器会监听套接字接口跟已连接套接字接口装进数组中。
  2. 通过select函数,遍历socket的数组,当某一个socket有响应,我们可以通过select函数的函数值/返回值反馈出来。
  3. 相应处理:若是检测到服务器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 最大等待时间

声明

因为个人能力有限,若是文章中出现不妥之处,可以在评论中留言,或是私信给我,我一定会认真改进。若是文章能帮到各位,不胜荣幸。文章会一直维护哦。。。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值