【问题解决】socket黏包

举报
王建峰 发表于 2021/11/19 01:57:36 2021/11/19
【摘要】 问题描述: 建立TCP连接之后, client端write fd,向server端发送数据。server端read fd。结果出现收发不一致的现象,原本的期望是client发一次,server收一次。但是却出现了收发不一致的现象。 client:write 连续写两次 server:read读一次   &nbsp...

问题描述:

建立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缓冲区的数据读走。

 

大牛给出的思路

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

 

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/95893419

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。