【问题解决】socket黏包
【摘要】
问题描述:
建立TCP连接之后, client端write fd,向server端发送数据。server端read fd。结果出现收发不一致的现象,原本的期望是client发一次,server收一次。但是却出现了收发不一致的现象。
client:write 连续写两次
server:read读一次
 ...
问题描述:
建立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)