socket编程日记
自定义分割包协议
注意到,socket发送出去的包最大只能为tcp的mtu长度减去包头长度,超过长度的包会分批到达
TCP保证了包到达的顺序及正确性
UDP需要自己实现包顺序及异常校验
对端如果没有分包协议会导致一次性读过头或者没读完就进行数据操作
分包协议的两种方式
包头放置数据
- 特征值
- 数据长度
- 数组字段
接收端伪代码形式
header{
len
}
while(1){
buf[64]
socket.recv(buf)
read(&header,buf)
data = new data[header.len]
readLen = readRemainBuf(buf,data)
socket.recv(data,(header.len-readLen))
}
包尾放置分隔符
- 数据字段
- 分隔符
while(1){
buf
socket.recvAndExpend(buf)
while not found delimiter:
socket.recvAndExpend(buf)
if found delimiter:
set delimiterIndex
return buf[0:delimiterIndex]
}