IO多路复用的理解


C/C++ 网络IO和网络IO多路复用的select ,poll,epoll方法


首先介绍下 IO多路复用的 Posix APi: socket(),bind(),listen(),accept(),recv(),send();目前本节先介绍下 这些APi的使用和参数;下节 具体介绍这些Api的内核实现;

首先 socket 网络 IO 主要用于客户端,服务端通信。

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

我觉得这个函数的作用就是 服务端创建在VFS 一个 socket文件,文件进程对应sockfd;我就联想 socketfd和filefd,用C打开一个文件

没有文件就创建一个文件,有文件就 给打开的文件一个返回一个文件描述符(filefd),打开的文件 对应一个进程ID 我觉得改进程ID 就是filefd;

sockaddr_in 和 sockaddr这2个等同,可以查看源码;

在这里插入图片描述
可以算出来,_pad[8] 这个字符串是为了 保证 sockaddr_in和 sockaddr 的内存大小一致。

解释下为什么要将 sockaddr_in 强转为sockaddr,作为Posix 函数的入参;
在这里插入图片描述

sockaddrsockaddr_in 的长度相同,都是16字节,只是将IP地址和端口号合并到一起,用一个成员 sa_data 表示。要想给 sa_data 赋值,必须同时指明IP地址和端口号,例如"127.0.0.1:8080",遗憾的是,没有相关函数将这个字符串转换成需要的形式,也就很难给 sockaddr 类型的变量赋值,所以使用 sockaddr_in 来代替。**这两个结构体的长度相同,强制转换类型时不会丢失字节,也没有多余的字节。**一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。更加深入的研究将在后续章节中叙述。

bind() ;

listen();

这2个函数没啥可讲的。listen函数可以去掉试一试,我当时去掉了,不行,li s ten函数应该是状态变化图的一个阶段;

select函数
在这里插入图片描述

select(fd , &rset, NULL, NULL, NULL);

unsigned long fds_bits[16]

​ fds_bits[0]: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

​ 0 1 2 3 4 5 6 7 60 61 62 63 64 65 66 76

Bitmap思想: 你想设置 0-1024 以内的数字 比如5 ,那就讲数字5 对应的 0 置1

FD_ZERO(&rfds);

FD_SET(sockfd, &rfds);

FD_XXX 就是利用bitmap 设置的。

poll函数:
在这里插入图片描述

epoll函数:

int epfd = epoll_create(1);//内核创建红黑树

epoll_ctl();//add modify delete //内核修改红黑树

epoll_wait();//监听socket事件(POIIIN P OLLOUT)//

在这里插入图片描述
struct epoll_event event;

Note:下面是我查看socket 创建过程的验证,我用网络调试助手作为客户端,
在这里插入图片描述

服务端是某零声的代码 ,我查看 服务端的端口 nestat -anp |grep serverport

在这里插入图片描述

img

下期将详细介绍 select poll epoll 这些Posix Api的 内核源码实现。

谢谢大家 阅读,有不合适的可以留言,我会及时完善,供大家参考。

文章参考于<零声教育>的C/C++linux服务期高级架构系统教程学习:https://ke.qq.com/course/417774?flowToken=1020253

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值