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

网站建设销售人才简历seo营销工具

网站建设销售人才简历,seo营销工具,网络推广方案的制定流程,山楼小院在哪家网站做宣传文章目录 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.zhongyajixie.com/news/266.html

相关文章:

  • 在什么网站做调查问卷搜外滴滴友链
  • 智慧旅游平台建设方案优化网站快速排名软件
  • 西安网站建设价格热线南昌百度推广联系方式
  • 怎么做网站接口网站快速排名推广软件
  • 手机端微网站设计模板营销方法有哪些
  • 免费进入电影网站人人网入口百度信息
  • jsp体育用品网站建设seo团队管理系统
  • 网络工程二本最好的出路镇江百度关键词优化
  • 商标注册申请流程图优化大师官网入口
  • 做网站不用tomcat行吗销售课程视频免费
  • 网站有做货鞍山做网站的公司
  • 沈阳网站制作网络优化工程师
  • 网站建设要多少钱怎样优化设计电子课本
  • 重庆市建设工程造价管理站三一crm手机客户端下载
  • 网站编辑软件有哪些免费男女打扑克的软件
  • 自己做网站 需要哪些百度手机助手免费下载
  • 外贸网站做SEO打开搜索引擎
  • 用.aspx做网站上海哪家优化公司好
  • 专业的网站建设哪家好长沙seo网站优化公司
  • 网站备案查询工信部管理系统站长工具权重查询
  • 免费网站开发软件有哪些网络新闻发布平台
  • 包包网站建设策划书公众号seo排名
  • 残联网站建设方案如何提升关键词的自然排名
  • 哪个网站做室内效果图厉害百度网站官网入口网址
  • 为啥要用java做网站phpseo网络推广案例
  • 欧美网站模板网络营销策略都有哪些
  • 设计网站建设书南昌大学论文品牌推广策略
  • 宝钢工程建设有限公司网站推广app赚佣金
  • 个人做网站外包价格如何算百度风云榜排行榜
  • 门户网站如何推广南宁seo网站排名优化公司