问题描述:
建立TCP连接之后, client端write fd,向server端发送数据。server端read fd。结果出现收发不一致的现象,原本的期望是client发一次,server收一次。但是却出现了收发不一致的现象。
client:write 连续写两次
server:read读一次
问题分析:
两端同时对socket缓冲区操作,client连续两次write都写到同一次socket缓冲区里,出现黏包现象,而server read只要有数据读完,就会返回, 所以read一次读了两次write的数据。如果只写不读,就都放到了socket的缓冲区里,等待读走。
而tcp虽说是可靠协议,也只能保证四层可靠(可靠保证数据到达)。数据在逻辑上的完整性还需要具体的应用层协议来保证。
解决方法一(简单粗暴型)
就是write中间加延时,一般ms级别的延时就可以。这样就保证在延时的过程中,server端read 把socket缓冲区的数据读走。
大牛给出的思路
设计应用层协议,一般都是包头加包体这样设计,服务端和客户端事先沟通好。