粘包问题怎么解决_包带粘手怎么处理

粘包问题怎么解决_包带粘手怎么处理如何解决粘包问题粘包就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中受到的数据包数量可能大于1个,当大于1个时,可能时几个包加上某个包的部分,这这干脆几个完整的包在一起。当然,也可能收到的数据只是一个包的部分,这种情况一般也叫做半包。无论是半包问题还是粘包问题,因为TCP是流式数据,所以其解决思路还是从收到的数据中把包与包的边界区分出来。如何区分,有以下三种办法。固定包长的数据包。固定包长,即每个协议包的长度都是固定的。假如我们规定每个协议包的大小都是64字节,每收满64字节,就取出来

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

如何解决粘包问题

粘包就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中受到的数据包数量可能大于1个,当大于1个时,可能时几个包加上某个包的部分,这这干脆几个完整的包在一起。当然,也可能收到的数据只是一个包的部分,这种情况一般也叫做半包。

在这里插入图片描述

无论是半包问题还是粘包问题,因为TCP是流式数据,所以其解决思路还是从收到的数据中把包与包的边界区分出来。如何区分,有以下三种办法。

  1. 固定包长的数据包。固定包长,即每个协议包的长度都是固定的。假如我们规定每个协议包的大小都是64字节,每收满64字节,就取出来解析(如果不够,就先存起来),则这种通信协议的格式简单但灵活性太差。如果包的内容长度小于指定的字节数,对剩余的空间就需要填充特殊的信息,例如\0;如果包的内容超过指定的字节数,又得分包分片,则需要增加额外的处理逻辑——在发送端进行分包分片,在接收端重新组装。
  2. 以指定的字符串为包的结束标志。这种协议包比较常见,即在字节流中遇到特殊的符号值时就认为到一个包的末尾了。例如FTP或者SMTP,在一个命令或者一段数据后面加上\r\n表示一个包的结束。对端收到数据后,每遇到一个\r\n,就把之前的数据当作一个数据包。这种协议一般用于一些包含各种命令控制的应用中,其不足指出就是如果协议包的内容部分需要使用包结束标志字符,就需要对这些字符做转码或者转移操作,以免被接收方错误地当成包结束标志而误解析。
  3. 包头+包体格式,这种格式一般分为两部分,即包头和包体,包头是固定大小的,且包头必需包含一个字段来说明接下来的包体有多大。例如。
struct msg_header
{ 
   
	int32_t bodySize;
    int32_t cmd;
};

是一个典型的包头结构,bodySize指定了这个包的包体有多大。由于包头的大小是固定的,这是是8字节,所以对端先收取包头大小的字节内容,然后解析包头,根据包头中指定的包体大小收取包体,等包体收够了,就组装成一个完整的包来处理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169713.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JWT单点登录的三种解决方案「建议收藏」

    JWT单点登录的三种解决方案「建议收藏」看过不少JWT和单点登录系统的文章,大部分说的比较片面。这里就根据自己的实际开发经验谈一下我的理解。可以总结为以下三种方案:三种方案:1.纯Jwt2.Jwt+认证中心Redis3.Jwt+认证中心Redis+多系统Redis1.纯Jwt方案1.用户去认证中心登录,认证中心生成jwt,返回给客户端。2.客户端携带jwt请求多个系统3.每个系统各自解析jwt,取出用户信息。能解析成功就说明jwt有效.

    2022年5月21日
    127
  • 服务器性能监视器_性能计数器感叹号

    服务器性能监视器_性能计数器感叹号文章来源:http://blog.csdn.net/lhfzd2004/article/details/1722379上一篇文章《服务器性能监控之WMI》介绍了通过远程com获取服务器性能(当然也可用于本地),那么这篇主要说说windows系统自带的性能监视功能—–>performancecouonter.打开管理工具–>性能,我们可以立即看到服务器的CPU,进程运行时间,磁盘容量

    2022年10月8日
    0
  • c语言socket编程流程,C语言socket编程简单步骤「建议收藏」

    c语言socket编程流程,C语言socket编程简单步骤「建议收藏」服务器端/***************************************函数功能:创建套接字的函数*输入参数:无*输出参数:无*返回值:套接字的ID*/intcreat_socket(){intret;ret=socket(AF_INET,SOCK_STREAM,0);if(ret==-1){perror(“socketerror”);exit(1);}printf(“创建s…

    2022年7月13日
    15
  • 本地mysql文件浏览器_可视化数据库浏览器(SQLite Database Browser)

    本地mysql文件浏览器_可视化数据库浏览器(SQLite Database Browser)SQLiteDatabaseBrowser可以管理所有iphone数据,基于Qt库开发,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。用来处理SQLite3数据库文件的应用程序,它能够打开sqlite3数据库文件(常见的文件扩展名为.db,.db3,.s3db;只要文件是SQLite3数据库文件,其扩展名不规范也不要紧)。SQLiteDatabas…

    2022年9月9日
    0
  • hdoj2058_HB5082

    hdoj2058_HB5082Problem:2058(Thesumproblem)JudgeStatus:AcceptedRunId:2716000Language:C++Author:huwenbiaoCodeRenderStatus:RenderedByHDOJC++CodeRenderVersion0.01Beta/***…

    2022年10月2日
    0
  • 回溯法解01背包问题_01背包问题回溯法伪代码

    回溯法解01背包问题_01背包问题回溯法伪代码一、问题n皇后问题的解空间树是一颗排列树,而01背包问题的解空间树应该是一颗子集树。再简述下该问题:有n件物品和一个容量为c的背包。第i件物品的价值是v[i],重量是w[i]。求解将哪些物品装入背包可使价值总和最大。所谓01背包,表示每一个物品看成一个整体,要么全部装入,要么都不装入。这里n=5,c=10,w={2,2,6,5,4},v={6,3,5,4,6}。01背…

    2022年8月30日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号