出现粘包的情况如下:
比如你一次性接收固定 BUF 大小的数据(比如1024字节) 尤其是在处理 iocp 接收数据的时候,
发送端的一个数据包可能没有1024字节大小,比方说发送聊天内容,一个聊天内容即一个数据包,1024字节就可能包含很多个
数据包,第二次接收固定BUF大小的数据的时候,就可能会出现了粘包,半包问题! ==》 这种情况就必须要做粘包,半包处理了!!
该固定BUF缓存最后一个数据包可能结构如下:
1. 只包含了部分包头,余下包头及全部包体在下一次接收的固定BUF缓存中首部
2.刚好包含了完整包头,包体在下一次接收的固定BUF缓存中首部
3. 包含了全部包头及部分包体,余下包体在下一次接收的固定BUF缓存中首部
(让以上粘包,半包问题出现很容易,服务器在命令行模式下,按住cmd.exe滚动条,客户端依然在不断的发送数据)
避免粘包问题的方法思路其实很简单:
接收端线性接收数据,保证先读包头(sizeof( packet_header_t)) 大小的数据,并验证校验和,然后再根据包头里包含的
包体数据大小,接收指定长度的数据, 以此接收方式循环.....
比如你一次性接收固定 BUF 大小的数据(比如1024字节) 尤其是在处理 iocp 接收数据的时候,
发送端的一个数据包可能没有1024字节大小,比方说发送聊天内容,一个聊天内容即一个数据包,1024字节就可能包含很多个
数据包,第二次接收固定BUF大小的数据的时候,就可能会出现了粘包,半包问题! ==》 这种情况就必须要做粘包,半包处理了!!
该固定BUF缓存最后一个数据包可能结构如下:
1. 只包含了部分包头,余下包头及全部包体在下一次接收的固定BUF缓存中首部
2.刚好包含了完整包头,包体在下一次接收的固定BUF缓存中首部
3. 包含了全部包头及部分包体,余下包体在下一次接收的固定BUF缓存中首部
(让以上粘包,半包问题出现很容易,服务器在命令行模式下,按住cmd.exe滚动条,客户端依然在不断的发送数据)
避免粘包问题的方法思路其实很简单:
接收端线性接收数据,保证先读包头(sizeof( packet_header_t)) 大小的数据,并验证校验和,然后再根据包头里包含的
包体数据大小,接收指定长度的数据, 以此接收方式循环.....