C++ Socket网络编程 1.3版本 将服务端升级为Select模型处理多客户端

本文介绍了如何将C++ Socket服务端升级为Select模型,以处理多个客户端的网络请求。Select模型在多种操作系统中被广泛支持,能定时检查并处理新连接和业务。文章详细解析了Select函数的工作原理,并展示了服务端如何根据FD_SET和FD_ISSET判断处理accept还是recv操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的版本(1.1和1.2)中,服务端和客户端都是1对1的阻塞模型网络程序,例如服务端的accept,recv都是阻塞等待。一个最大的问题是,当服务端阻塞时,不能处理其它的业务,从而无法实现一个服务端处理多个客户端的功能。因此,将服务端升级为Select模型处理多客户端的网络请求。

Select网络模型是Linux、Windows、IOS、安卓等操作系统中标准C/C++支持的网络通信模型,内部会定时查询是否有新的客户端连接/新的业务需要处理,从而做出相应的处理。掌握了Select网络模型,便可以支持编写中、小型的网络程序。

在这里插入图片描述
Socket Select网络模型在Windows下面的定义

select(
    _In_ int nfds,		//在windows下面没有意义  在Unix衍生的操作系统中使用  
    _Inout_opt_ fd_set FAR * readfds, 		 //_Inout_  表示这个参数传入时是有意义的 传出时也是有意义的   指向检查可读性的套接字集合的可选的指针。表示客户端有读的socket客户端需求等待处理
    _Inout_opt_ fd_set FAR * writefds,		//指向检查可写性的套接字集合的可选的指针。表示客户端有写的socket客户端需求等待处理  
    _Inout_opt_ fd_set FAR * exceptfds,	//指向检查错误的套接字集合的可选的指针。表示客户端有异常的Socket客户端的需求等待处理
    _In_opt_ const struct timeval FAR * timeout 	//函数需要等待的最长时间,需要以TIMEVAL结构体格式提供此参数,对于阻塞操作,此参数为null。 
    );

select函数的理解:(转载自https://www.cnblogs.com/zxllm/p/5420065.html)
select函数用于决定一个或者多个socket的状态。对于每一个socket,客户端可以请求读、写或者错误状态信息。一个请求给定状态的socket集由fd_set结构体指定。在fd_set结构体中的socket必须和单个服务端联系在一起。select函数返回满足条件的套接字个数。fd_set集合可以通过一些宏手动操作。

(1)参数readfds指示检查socket的可读性。当socket在listen状态(服务端socket),如果已经接收一个连接请求,这个socket会被标记为可读,例如一个accept会确保不会阻塞的完成。对于其他的socket(客户端socket),可读性意味着队列中的数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值