单客户端-短连接
Client
1 |
|
Server
1 |
|
单客户端-长连接
Client
1 |
|
Server
1 |
|
多客户端-select
Client
1 |
|
Server
1 |
|
Result
多客户端-epoll
client
1 |
server
1 |
|
粘包/拆包
发生原因
- 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包。
- 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
- 要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。
- 接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。
- 而数据之所以会发送粘包拆包的根本原因是TCP的数据包是流的方式传输的,就像水流一样,没有一个分界的东西。
处理方法
- 特殊分隔符
- 固定发包大小
- 发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。 第1种和第2种方法都会存在一些误差,没有办法很好处理好粘包拆包,所以一般的方法都是采用第3种。以下我先给出代码,然后再结合代码分析第3种粘包拆包的处理方式。
client
1 |
|
server
1 |
|
心跳检测
client
1 |
|
server
1 |
|
protocol.h
1 |
|
git仓库
https://github.com/TechCodingLearning/cplus_socket