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

网站上放百度地图怎么安徽360优化

网站上放百度地图怎么,安徽360优化,百度开户,做网站的话 java和c文章目录 0. 代码仓库1. TCP通信粘包问题2. 粘包、拆包表现形式2.1 正常情况2.2 两个包合并成一个包2.3 出现了拆包 3. 粘包的处理-参考仓库中的文件TcpSocket.cpp3.1 发送数据时候的处理3.2 接收数据时候的处理 0. 代码仓库 https://github.com/Chufeng-Jiang/OpenSSL_Secure_…

文章目录

  • 0. 代码仓库
  • 1. TCP通信粘包问题
  • 2. 粘包、拆包表现形式
    • 2.1 正常情况
    • 2.2 两个包合并成一个包
    • 2.3 出现了拆包
  • 3. 粘包的处理-参考仓库中的文件TcpSocket.cpp
    • 3.1 发送数据时候的处理
    • 3.2 接收数据时候的处理

0. 代码仓库

https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform

1. TCP通信粘包问题

tcp是以流动的方式传输数据,没有边界的一段数据。像打开自来水管一样,连成一片,没有边界。传输的最小单位为一个报 文段(segment)。

tcp Header中有个Options标识位,常见的标识为mss(Maximum Segment Size)指的是:连接层每次传输的数据有个最大限制MTU(Maximum Transmission Unit),一般是1500比特,超过这个量要分成多个报文段,mss则是这个最大限制减去TCP的header,光是要传输的数据的大小,一般为1460比特。换算成字节, 也就是180多字节。

tcp为提高性能,发送端会将需要发送的数据发送到缓冲区,等待缓冲区满了之后,再将缓冲中的数据发送到接收方。 同理,接收方也有缓冲区这样的机制,来接收数据。

发现,如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题。

2. 粘包、拆包表现形式

现在假设客户端向服务端连续发送了两个数据包,用packet1和packet2来表示,那么服务端收到的数据可以分为三种,现列举如下:

2.1 正常情况


第一种情况,接收端正常收到两个数据包,即没有发生拆包和粘包的现象,此种情况不在本文的讨论范围内。

2.2 两个包合并成一个包

第二种情况,接收端只收到一个数据包,由于TCP是不会出现丢包的,所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。
在这里插入图片描述

2.3 出现了拆包

第三种情况,这种情况有两种表现形式,如下图。接收端收到了两个数据包,但是这两个数据包要么是不完整的,要么就是多出来一块,这种情况即发生了拆包和粘包。在这里插入图片描述

3. 粘包的处理-参考仓库中的文件TcpSocket.cpp

3.1 发送数据时候的处理

添加4个字节的数据头,存储数据块的长度。

dataLen为发送原始数据的长度,在此基础上添加4个字节的长度,并开辟netdata空间用来存储数据。

int dataLen = sendData.size() + 4;
unsigned char *netdata = (unsigned char *)malloc(dataLen);

在发送的时候,需要从主机字节序转换为网络字节序。

  • 先求将原始数据转换成网络字节序的长度大小
    int netlen = htonl(sendData.size());

  • 再将原始数据的长度,拷贝到开辟的空间netdata前4个位置
    memcpy(netdata, &netlen, 4);

  • 最后将原始数据内容拷贝到开辟的空间netdata中第4个字节以后的位置
    memcpy(netdata + 4, sendData.data(), sendData.size());

int TcpSocket::sendMsg(string sendData, int timeout)
{// 返回0->没超时, 返回-1->超时int ret = writeTimeout(timeout);if (ret == 0){int writed = 0;int dataLen = sendData.size() + 4;// 添加的4字节作为数据头, 存储数据块长度unsigned char *netdata = (unsigned char *)malloc(dataLen);if (netdata == NULL){ret = MallocError;printf("func sckClient_send() mlloc Err:%d\n ", ret);return ret;}// 转换为网络字节序int netlen = htonl(sendData.size());memcpy(netdata, &netlen, 4);memcpy(netdata + 4, sendData.data(), sendData.size());// 没问题返回发送的实际字节数, 应该 == 第二个参数: dataLen// 失败返回: -1writed = writen(netdata, dataLen);......

3.2 接收数据时候的处理

  • 先读包头的4个字节并转换成主机字节序,就知道报文有多长。
    readn函数用于读取网络字节流的文件到缓存netdatalen空间中
    ret = readn(&netdatalen, 4); //读包头 4个字节
    int n = ntohl(netdatalen);

  • 根据包头中记录的数据大小申请内存, 接收数据,添加一个‘\0’结束符
    char* tmpBuf = (char *)malloc(n + 1);

  • 根据长度读数据
    ret = readn(tmpBuf, n);

string TcpSocket::recvMsg(int timeout)
{// 返回0 -> 没超时就接收到了数据, -1, 超时或有异常int ret = readTimeout(timeout); if (ret != 0){if (ret == -1 || errno == ETIMEDOUT){printf("readTimeout(timeout) err: TimeoutError \n");return string();}else{printf("readTimeout(timeout) err: %d \n", ret);return string();}}int netdatalen = 0;ret = readn(&netdatalen, 4); //读包头 4个字节if (ret == -1){printf("func readn() err:%d \n", ret);return string();}else if (ret < 4){printf("func readn() err peer closed:%d \n", ret);return string();}int n = ntohl(netdatalen);// 根据包头中记录的数据大小申请内存, 接收数据char* tmpBuf = (char *)malloc(n + 1);if (tmpBuf == NULL){ret = MallocError;printf("malloc() err \n");return NULL;}ret = readn(tmpBuf, n); //根据长度读数据if (ret == -1){printf("func readn() err:%d \n", ret);return string();}else if (ret < n){printf("func readn() err peer closed:%d \n", ret);return string();}tmpBuf[n] = '\0'; //多分配一个字节内容,兼容可见字符串 字符串的真实长度仍然为nstring data = string(tmpBuf);// 释放内存free(tmpBuf);return data;
}
http://www.hkea.cn/news/683496/

相关文章:

  • 用wordpress做网站百度推广管理
  • 一个空间可以放两个网站吗html模板网站
  • 做试用网站的原理网站推广优化平台
  • 软件工程培训机构学费亚马逊seo什么意思
  • 做恶搞网站软件有哪些苏州seo怎么做
  • 怎么做微信小说网站企业网络营销策划方案
  • 网站后台上传图片失败百度下载免费安装最新版
  • 镇江做网站需要多少钱企业网站模板设计
  • 西安seo优化系统网页seo
  • 如何用网站模板做网站广州网络营销推广
  • 承德手机网站建设seo推广排名
  • wordpress块引用一个网站可以优化多少关键词
  • 360网站卖东西怎么做的无锡seo优化公司
  • 邢台人民网站百度视频推广怎么收费
  • 常州天启建设公司网站高端快速建站
  • ppt模板免费下载网站不用登录seo测试工具
  • 四川建设人才网官网查询阜新网站seo
  • 太原网站开发定制百度网盘官网下载
  • 业主装修日记那个网站做的好片多多可以免费看电视剧吗
  • 租车网站建设站长之家源码
  • 昌吉州回族自治州建设局网站地产渠道12种拓客方式
  • 北京市网站公司网络项目免费的资源网
  • 电子商务网站规划、电子商务网站建设站长工具 忘忧草
  • 凡科建网关键词优化公司哪家好
  • seo排名推广工具seo公司多少钱
  • 做视频网站赚钱怎么在百度上推广自己的公司信息
  • 网站建设凡科厦门网站建设平台
  • 互联网行业pest分析福州百度快速优化排名
  • 做网站的接私活犯法吗如何对网站进行推广
  • 身高差效果图网站优化师和运营区别