创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!
个人座右铭:1.没有横空出世,只要厚积一定发。
2.你可以学历不高,你可以不上学,但你不能不学习。
一. socket初识
1.概念:socket又名“插座”,由以下两部分组成:
(1)文件fd:linux下一切皆文件,此fd可用于对此文件进行ioctl(操作函数)控制。(IO部分)
(2)网络部分(五元组):sIP(源IP)、sport(源端口)、dIP(目的IP)、dport(目的端口)、协议(传输层协议tcp或者udp)。
2.tcp和udp说明
(1)tcp基于连接,为可靠传输。
(2)udp基于无连接,为不可靠传输。
3.tcp三次握手发生时间阶段
(1)client :三次握手发生在connect函数中。
(2)server:listen阻塞等三次握手第一次的请求到来,在建立完成三次握手后,把对应client信息加入accept队列,三次握手完成。 系统会通过检测accept队列,来调用accept函数,建立连接。
二、SIGIO信号
1.基础概念:(1)此信号表示文件描述符准备就绪
(2)Linux系统中有31种信号,从1到31号信号,信号的序号为信号所对应的的数值。
2.网络编程适用范围:适合UDP,不适合tcp:
原因:1.udp基于无连接,在有数据到来时,网络协议栈告诉应用程序,由应用程序对应信号的处理函数进行处理。
2:tcp理论可行,但是实际不行,主要原因如下:
(1)应用层信号处理函数需要处理两部分,accept和recv部分,比较难处理。
(2)tcp处理的时候,sigio信号太多。
3.进程的信号集如何保存信号?
进程保存信号,可以查看内核源码Sched.h中的task_struct结构体中的sighand_struct结构体保存。
4.调用signal,如何保存信号?
在每个进程空间,都有一个sighand_struct->sigaction->action[64]的集合,专门用来存储对应的信号。调用signal信号后,把信号存储到action[sig-1]的位置。
注意:sig表示信号的序号也是信号对应的值, sig-1是因为数组的原因,比如28号信号存储到action[27].
5.信号如何发送的?
在内核源码signal.c中signalfd_notify函数进行通知,如果waitqueuqe_active函数条件满足,通知应用层。
6.进程中信号处理流程原理,由两部分组成:
(1)注册部分:应用层在调用signal函数时,进程把对应的信号存储到action[sig-1]的位置,不同的信号存到不同的位置。并且把信号处理函数注册为回调函数,然后等待waitqueue_action函数的条件满足。
(2)回调处理:当waitqueue_action条件满足后,调用信号处理函数进行处理。
三、多路复用poll/select/epoll初识
多路复用概念:管理多路IO的一种方法
1.poll
(1)函数模型pool(pfd,length,timeout);
(2) 原理:在等待timeout时间后,把对应fd,传给内核,如果对应的fd可操作,内核返回对应fd,具体读、写、错误,可以通过对应方式获得。
2.select
(1)函数原型:select(maxfd+1, rfds, wfds,efds, timeout);
rfds:读集合
wfds;写集合
efds:错误集合
timeout:等待时间
maxfd+1:要操作的所有fd数量,
(2)原理:select函数把所有fd传入内核,然后在select函数内部阻塞等待。
a.如果有fd可操作,内核返把要操作的fd放到对应的集合中,select立即返回。
b.如果没有fd课操作,select阻塞timeout时间,返回。
c.select返回后,对对应的fd操作或者不操作,清理对应的集合,再次阻塞。
3.epoll
(1)epoll_create();此函数的参数,只有大于0和等于0的区别,在我们使用的时候,必须传入大于0的数值作为参数。
(2)原理:epoll把所有监控的fd传入内核,当有fd有数据要读取时,返回给对应的fd到epoll_wait,应用层进行处理。
5837

被折叠的 条评论
为什么被折叠?



