视频链接【C/C++网络编程,从socket到epoll】https://www.bilibili.com/video/BV11Z4y157RY?vd_source=8d1ec00b45049370fe349649f1886a9a
总的来说是偏应用性的视频分享,原理涉及不多,通俗易懂,看完后就可以写自己的tcp连接程序了
第一章 基本概念
Socket分为流Socket和数据报Socket,流Socket是基于Tcp协议的双向可靠,数据报Tcp是基于Udp 协议的。
第二章 Socket通讯基础流程框架
1、客户端:
1.1创建客户端socket
1.2向服务器发起连接请求
1.3与服务器通信,等待服务器回复
1.4断开socket连接
2、服务端
1.1创建服务端socket
1.2将用于通信的服务器和端口地址绑定到socket
1.3把socket设置为监听模式
1.4与客户端连接
1.5与客户端通信
1.6断开socket连接
第三章 主机字节序和网络字节序
大端字节序:高位存在低地址
小端字节序:低位存在低地址
TPC/IP协议中规定了,网络字节序是大端字节序。主机字节序与主机的cpu有关,大部分采用小端字节序
c语言中常用的转换函数:htons、htonl、ntohs、ntohl。h表示本地,n表示网络,s和l分别表示32位和64位
第四章 socket相关结构体
sockaddr:成员包括一个ushort类型的地址和一个14字节的空间存放端口与地址
sockaddr_in:包括short类型的地址、ushort类型的端口号、ulong类型的地址和8给字节的对齐空间
hostnet:包含主机名,主机所有别名,主机ip类型,主机ip地址长度和主机ip地址,利用gethostbyname可以获取到这个结构体
gethostentbyname:可以通过ip地址或者域名来获取主机结构体
第五章socket相关函数
1、bind函数:1024下的端口是系统保留端口需要权限
2、socket函数
2.1、参数:domin 协议域或者协议族,常用AF_INET(IPV4+端口),AF_INET6(IPV6+端口),AF_LOCAL;type:socket类型,常用SOCK_STRAM(流式SOCKET), SOCK_DGRAM(报文式SOCKET),SOCK_RAW,SOCK_PACKET, SOCK_S
2.2、最大连接数:TCP连出受端口限制仅有65535,但是TCP连入仅受内存限制。socket并没有端口占用一说
3、listen函数,accept函数和connect函数
3.1、listen的第二个参数为最大链接就绪数目,socket的最大就绪连接数为n+1,超出的链接会被服务端卡在半链接状态也就是未接受第三次握手前也就是设置为ESTABLISTED状态前,只有设置为ESTABLISTED才能被accept函数接收
3.2、accept函数接收一个就绪的客户端链接并且重新分配一个socket进行通讯,listen的socket只负责监听不负责通讯
4、recv函数和send函数
4.1、返回值为已发送或者已接收的数据大小
4.2、recv函数在没有接收到数据的时候会阻塞
4.3、缓存区满了的情况下,send函数也会存在阻塞
第六章、TCP三次握手与SOCKET连接状态:
第七章、分包和沾包
1、分包概念:发送方发送一个信息包,接收方接收到两个信息包
2、沾包概念:发送方发送两个信息包,接收方接收到一个信息包
3、tcp协议保证了数据顺序不变并且分割包之中不会插入其他数据
4、常用解决方法:自定义协议,通常数据包为信息长度+信息数据
第八章、freecplus开源框架
GitHub - veis-lzf/freecplus: freecplus开源框架,包含了数据库操作、socket、ftp服务器等。
第九章、多进程网络服务端框架
1、利用fork()创建子进程进行通讯
2、避免僵尸进程
2.1、父进程中屏蔽子进程退出的信号,将子进程回收交给系统init处理
2.2、在父进程中接收子进程结束信号自己手动回收
3、fork会把父进程所有的东西都复制一份,但是实际上父进程并不关心通讯socket,子进程并不关心监听socket,所以需要关掉
第十章、日志
过程中需要将一些信息输入文本中做记录
第十一章、Tcp短连接和长连接
1、短连接:只连接一次或者连接后通讯完成马上断开,管理简单但是开销大
2、长连接:一直保持tcp连接,需要控制程序来额外控制
3、在建立长连接时,客户端每隔几秒发送一个心跳报文,以保证连接生效,心跳包间隔建议60秒之内,服务端如果一段时间没有收到心跳报文,主动关闭连接,释放资源
第十二章、多线程网络服务端框架
与多进程类似
第十三章、网络服务端性能测试
性能指标:
1、服务端并发能力:服务端的最大并发量(可连接的客户端最大数量)
2、服务端业务处理能力:服务端最大业务处理能力(每秒可以处理的业务最大数量)
3、客户端业务响应时效:客户端相应时间(发出业务请求时间与收到服务端回应的时间间隔)
4、网络带宽:只发送数据不接收数据,上行和下行分开测试
第十四章、IO复用
采用单个进/线程就可以管理socket
select
1、流程:
1.1、创建socket集合fd_set
1.2、把监听的socket和客户端socket都加入集合
1.3、socket阻塞在select等待事件
1.4、用FD_ISSET判断fd_set中有事件socket
1.5、监听socket有事件表示有新的客户端连入,客户端socket有事件表示有数据可读或socket断开
2、函数:
2.1、参数:
nfds:最大socket,一般为fd_set的容量
readfds:需要读的socket,一般为fd_set
writefds:需要写的socket
exceptfds:产生异常的socket
timeout:超时时间
2.2、返回值:表示成功的socket的个数,0表示超时,-1表示失败,可能内存满了、收到发出的信号或者输入错误
3、水平触发机制:如果报告了事件后未处理,或数据没有全部读取,那么下次select时候继续会报告
4、缺点:
4.1、支撑的文件描述符数量太小,默认1024,可以增大但是效率会变慢,没有意义
4.2、每次调用select都需要把fd_set从用户态拷贝到内核
4.3、同时在线大量客户端,需要遍历fd_set,效率太低
poll
1、没有最大描述符的限制,select采用的文件描述符是bitmap,poll采用的是数组,但是select缺点的2和3依然存在
2、参数:
fds:socket数组
nfds:fds中的有效数
timeout:超时时间
epoll
1、函数
1.1、epoll_create创建epoll句柄
1.2、epoll_ctl注册需要监听的fd和事件
1.3、epoll_wait等待事件的发生
2、优点:epoll把原来相当于存储fd_set的数据机构直接放在内核中,并且epoll_wait只会返回有事件的socket,所以解决了select的2和3的缺点
3、可以设置水平触发和边缘触发,水平触发是如果报告了事件后未处理或者数据没有读取完,立即再次报告,边缘触发是如果报告了事件后未处理,或数据没有读取完,那么下次再报告