1.TCP流程:
服务端: 客户端:
创建socket---create_socket 创建socket
绑定ip和端口 -- bind
开启监听---listen
调用connect 尝试连接服务器
监听后,调用accept()与客户端
send / recv 收发数据 send / recv 收发数据
结束时close() close()
2. send和recv,相当于write 和read,其实是内核缓冲区和应用缓冲区之间交互,socket默认是阻塞模式,则会导致send、recv阻塞;
返回值: 等于n(n>0) 发送或接受n个字节数据,有可能还未结束
等于0 对端关闭连接
小于0 出错,信号中断,TCP窗口太小发不出(send),或者网卡缓冲区无数据可收(recv)
3. select 函数 检测一个或多个socket中是否有事件就绪;
读事件就绪;网卡缓冲区数据内大于等于低水位;连接关闭成功;
写事件就绪;发送缓冲区数据大于等于低水位;
异常事件就绪;
· int select (int nfds, fd_set*readfds, fd_set*writefds,fd_set*exceptfds, struct timeval *timeout);
缺点:需要每次从用户态到内核态拷贝,并且每次在内核要遍历事件集合,数量限制1024;
4. epoll 相比于select,没有数量限制,并且不需要遍历,epoll_wait通过event参数拿到所有就绪事件的fd,直接处理即可;
5.Reactor模式: 多路复用模型;
资源请求事件,注册处理;
多路复用器与事件分离器;select,poll,epoll检测是否有事件
事件处理器;
exp:几个服务员处理爆满的餐厅顾客;
socket, TCP, select,epoll,Reactor模式
原文:https://www.cnblogs.com/huahuagongzi521/p/14928660.html