概述
TCP粘包解决方案
黏包的在客户端发送频率低的情况下粘包不明显,下面是原来的服务器中epoll一个事件可读的回调函数recvdata(event_infor *infor)
,当调用这个函数然后recv()
函数读缓冲区的数据,指定大小为BUFF_MAX-1
,而BUFF_MAX
我设置为1024,一般单次接收数据小于这个值,所以基本上就是读取了所有缓冲区数据,接收过程:收到数据->epoll可读->调用回调函数->读取缓冲区所有数据->空缓冲区等待下一次接收。在处理客户端发来的聊天消息时还没有发生粘包现象,处理文件传输时一直粘包,问题分析是客户端高速循环调用send()
发送数据,也就是说服务器其实recv()
多条数据,比如说发送{"code":1}
和{"code":2}
服务器读一次可能是{"code":1}{"co
。
原服务器代码:
void Server::recvdata(event_infor *infor) {
int n = recv(infor->fd, infor->buff, BUFF_MAX - 1, 0);
if (n > 0) { //收到的数据
infor->buff[n] = '