当前位置: 首页 > news >正文

上海 设计网站建设中国工商业联合会

上海 设计网站建设,中国工商业联合会,临港管委会建设处网站,百度竞价收费标准如何用最简单的方法解决TCP传输中的分包粘包问题? 首先需要说明一点,分包粘包等等一系列的问题并不是协议本身存在的问题,而是程序员在写代码的时候,没有搞清楚数据的边界导致的。 看个简单的例子,TCP客户端不断的向服…

如何用最简单的方法解决TCP传输中的分包粘包问题?

在这里插入图片描述
首先需要说明一点,分包粘包等等一系列的问题并不是协议本身存在的问题,而是程序员在写代码的时候,没有搞清楚数据的边界导致的。

看个简单的例子,TCP客户端不断的向服务器发送字符串,每次发送完成随机睡眠一会。

char *buf[] = {"aaaaaaaaaaaaaaaaaaaaaaaaaaaa","bbbbbbbbbbb","ccccccccccccccccccc","dddddddddddddddddddddddddddddddddddddddddddd","eeeeeeeeeeeeeeeeeeeeeeee","ffffffff","gggggggggggggggggggggggggggggggggggg","hhhhhhhhhhhhhhhhhhhhhhhhhhhhh","iii","jjjjjjj","kkkkkkkkkkkkkkkkkkkkkk"
};srand(time(NULL));for (int i = 0; i < sizeof(buf) / sizeof(buf[0]); i++)
{   if (send(sockfd, buf[i], strlen(buf[i]), 0) == -1){perror("send");break;}usleep(1000 * 10);
}

服务器端接收数据的时候同样如此。

char buf[1024] = {0};srand(time(NULL));while (1) 
{   size = recv(fd, buf, sizeof(buf), 0); if (size == -1) {   perror("recv");break;}   else if (size == 0){printf("客户端断开连接 ...\n");break;}printf("收到一条数据 %s\n", buf);bzero(buf, 1024);usleep(1000 * (rand() % 100 + 1));
}

我们希望看到的现象是,服务器端收到的数据和客户端一样。

运行程序,客户端发送完成,但是服务器端收到的数据却不是我们想要的。

root@Turbo:test# ./1.tcp-server 
等待客户端的连接 ...
接受客户端的连接 4
收到一条数据 aaaaaaaaaaaaaaaaaaaaaaaaaaaa
收到一条数据 bbbbbbbbbbbcccccccccccccccccccddddddddddddddddddddddddddddddddddd
dddddddddeeeeeeeeeeeeeeeeeeeeeeeeffffffffgggggggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiijjjjjjj收到一条数据 kkkkkkkkkkkkkkkkkkkkkk
客户端断开连接 ...
root@Turbo:test#

数据内容没有变,出现了多个字符串连接在一起的现象。

原因就是发送数据过快,或者接收数据太慢,导致TCP缓冲区中积累了很多数据,调用recv函数读数据的时候,就会一下子全部读出来。

想要解决这个问题,最简单的办法就是分清楚数据包的边界。发送字符串之前,在数据包的前面加上字符串的长度。

char *sendMsg = (char *)malloc(1024);
int len = 0;srand(time(NULL));for (int i = 0; i < sizeof(buf) / sizeof(buf[0]); i++)
{len = strlen(buf[i]);memcpy(sendMsg, &len, sizeof(int));memcpy(sendMsg + sizeof(int), buf[i], len);if (send(sockfd, sendMsg, strlen(buf[i]) + sizeof(int), 0) == -1){perror("send");break;}memset(sendMsg, 0, 1024);usleep(1000 * 10);
}

接收数据的时候,先读取4个字节的整型数据,得到接下来字符串的长度,再读取对应长度的字符串。

char buf[1024] = {0};
ssize_t size;
int len = 0;srand(time(NULL));while (1) 
{   size = recv(fd, &len, sizeof(int), 0); size = recv(fd, buf, len, 0); if (size == -1) {   perror("recv");break;}else if (size == 0){printf("客户端断开连接 ...\n");break;}printf("收到一条数据 %s\n", buf);bzero(buf, 1024);usleep(1000 * (rand() % 100 + 1));
}

再次运行程序,不管睡眠时间怎么变化,服务器端收到的数据和客户端一样,也没有出现粘在一起的现象。

root@Turbo:test# ./1.tcp-server 
等待客户端的连接 ...
接受客户端的连接 4
收到一条数据 aaaaaaaaaaaaaaaaaaaaaaaaaaaa
收到一条数据 bbbbbbbbbbb
收到一条数据 ccccccccccccccccccc
收到一条数据 dddddddddddddddddddddddddddddddddddddddddddd
收到一条数据 eeeeeeeeeeeeeeeeeeeeeeee
收到一条数据 ffffffff
收到一条数据 gggggggggggggggggggggggggggggggggggg
收到一条数据 hhhhhhhhhhhhhhhhhhhhhhhhhhhhh
收到一条数据 iii
收到一条数据 jjjjjjj
收到一条数据 kkkkkkkkkkkkkkkkkkkkkk

方法很简单,也只是加了一个包头,其实目的就是为了告诉接收端,数据包从哪开始,到哪结束,这样就算缓冲区中有大量数据,也能分得清楚。

http://www.hyszgw.com/news/3275.html

相关文章:

  • 怎么免费建网站百度收录提交入口网址是什么
  • wordpress播放器样式seo是什么工作内容
  • 在什么网站可以自承包活来做谷歌优化排名公司
  • 虚拟币交易网站建设店铺推广方法
  • 简单网站建设推文关键词生成器
  • 深圳华丰大厦网站建设大型seo公司
  • 网站开发协议中的注意事项如何自制网站
  • 网站qq弹窗代码写软文的app
  • Java必须学好动态网站开发吗网站页面怎么优化
  • 企业网站建设方案模板搜索引擎营销的内容有哪些
  • 湖南中小企业建站价格做百度推广效果怎么样
  • 原子艺术做的网站怎么样子网站seo完整seo优化方案
  • 微信小程序开发介绍资源网站优化排名优化
  • 做一个门户网站多少钱企业微信会话内容存档
  • 怎么做中英文网站东莞网
  • 广东平台网站建设找哪家加强服务保障 满足群众急需需求
  • 哪些网站可以做简历企业品牌网站营销
  • 做电商网站公司简介廊坊百度快照优化哪家服务好
  • 怎样可以查看网站是由哪个公司做的市场营销推广
  • asp网站 被插入国内新闻最新5条
  • 深圳网站专业建设公司天津做网站的公司
  • 上海模板建站哪家好各城市首轮感染高峰期预测
  • 网站建设工作室拍照推广员网站
  • 网站建设中正在为您转seo站长论坛
  • 企业网站主页 优帮云网页设计与制作期末作品
  • 2022中文无字幕入口网站seo搜索引擎优化价格
  • 做门户网站价格电商的推广方式有哪些
  • dw班级网站建设免费观看行情软件网站进入
  • 网站服务器数据迁移国内最大的搜索引擎
  • 响应式网站建设服务提供商谷歌账号注册入口官网