多路IO转接之 select(c++)实现

本文介绍了使用C++实现select方法进行多路IO转接的基本思想,包括设置端口复用,利用select函数进行监听,并详细解释了函数参数、位操作以及select的优缺点。在实际应用中,select具有跨平台的优势,但存在最大监听数限制和效率问题。
摘要由CSDN通过智能技术生成

select 基本思想

设置lfd为端口复用

将需要监听的文件描述符通过select交给内核进行监听。当有事件发生,则通过select返回事件发生的个数。再对文件描述符集进行逐个扫描,进行事件处理。

包含文件:

<sys/select.h>

select的函数结构如下:

int select(int nfds, fd_set * readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

参数描述

fd_set: 文件描述符集结构体,是一个1024的位图,0表示无事件发生,1表示有事件发生。转换后的格式为:
typedef struct
{
long int __fds_bits[1024/(8*8))];
}
nfds:现在监听的文件描述符的最大值+1。
readfds:读集合,是一个传入传出参数,传入参数为需要读监听的文件描述符集,传出参数为发生变化的文件描述符。
writefds:写文件描述符(同上,传入传出参数)
execptfds:异常文件描述符(同上,传入传出)
tomeout:
0:不阻塞,扫描完立即返回
大于0:阻塞等待时长,到达时间还没有事件发生则立即返回。
NULL:永久阻塞等待事件发生
return:
-1:监听失败
大于0:发生事件的个数

相关位操作

1.将fd从集合set中移除
void FD_CLR(int fd,set *set);
2.判断描述符是否在集合中
int FD_ISSET(int fd,fd_set *set);
3.将描述符放入到集合中
void FD_SET(int fd,fd_set *set)
4.清空集合
void FD_ZERO(fd_set *set)

select优缺点

优点:跨平台,在windows 和Linux上均支持
缺点:涉及用户区和内核区来回拷贝,当链接较多,但活跃用户极少时候,效率低,最大监听数不可以超过1024。

select 代码

在这里插入代码片
#include<sys/types.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>	
#include<netinet/in.h>
#include<ctype.h>
#include<sys/socket.h>
#include<sys/select.h>

#include<iostream>
#include<string>

using namespace  std;
int main()
{
   
    /*1.创建socket*/
    int lfd=socket(AF_INET,SOCK_STREAM,0);
    if
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freesouls small geng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值