问题描述:

建立TCP连接之后, client端write fd,向server端发送数据。server端read fd。结果出现收发不一致的现象,原本的期望是client发一次,server收一次。但是却出现了收发不一致的现象。

client:write 连续写两次

server:read读一次

【问题解决】socket黏包_问题解决

 

 

问题分析:

两端同时对socket缓冲区操作,client连续两次write都写到同一次socket缓冲区里,出现黏包现象,而server read只要有数据读完,就会返回, 所以read一次读了两次write的数据。如果只写不读,就都放到了socket的缓冲区里,等待读走。

而tcp虽说是可靠协议,也只能保证四层可靠(可靠保证数据到达)。数据在逻辑上的完整性还需要具体的应用层协议来保证。

 

 

解决方法一(简单粗暴型)

就是write中间加延时,一般ms级别的延时就可以。这样就保证在延时的过程中,server端read 把socket缓冲区的数据读走。

【问题解决】socket黏包_socket_02

 

大牛给出的思路

设计应用层协议,一般都是包头加包体这样设计,服务端和客户端事先沟通好。