TCP 数据粘贴标签处理

      最后更新:2021-10-28 11:48:53 手机定位技术交流文章

      第一,他必须承担首当其冲的罪魁祸首。

      TCP是一种传输层协议,是一种连接的、安全的、以流动为基础的传输协议,由于数据传输以流动为基础,由发送者和接收端处理的数据数量可以以非对等的频率处理,并且可以根据其自身的需要确定。TPP协议显然有利,但有时会激怒我们。
      基于 TCP 的客户端和服务器之间的套接字连接通讯
      • 在整个通信过程中,客户将给定字符串的无限长度传送给服务器。
      • 服务器每次通信时必须接收并分析客户端字符串的未定长度 。
      根据前述说明,服务器在下列情况下获得数据:
      • 一个客户的全部数据包立即全部收到。
      • 同时收到了客户提供的无数据包,由于每包的长度不明,无法分开。
      • 一次获得一个或N数据集,作为下一个数据包的一部分,却无法解脱数据包,这仍然很可怕。
      • 我第一次拿到一半的数据包, 之后我拿到了剩下的数据包。
      • 还有其他不可避免的因素:例如,客户与服务器之间的网络速度波动,交付和接收的数据数量参差不齐。
      我们有时会把这些现象称为TCP的粘粘袋,但这是不正确的, 因为TCP本身是连接的流程传输协议, 这就是我们所说的, TCP是一个问题, 而这仅仅是用户的无知。 几个数据包不能一起分割, 是由于我们的要求的复杂性, 过程的复杂问题, 而不是协议的复杂问题, TCP 协议是这样说的。因此,问题是,如果服务器希望确保每次收到客户提供的数据包的无限长度,猴子应该如何解决这个问题?
      1. 使用标准层协议(如TCP/IP),https, https, https)用来封装将转让的无限期数据包。
      2. 每个数据集结尾处附加特殊字符,如果符合特殊字符,则表示收到数据。
      • 缺陷:效率低,一个字节的字节接收一个字节,以确定字符串是否属于例外。
      1. 当数据由两个部分组成:数据头和数据块时,在数据块的开头加上一个固定大小的页眉,然后才能传输数据块。
      • 页眉:持有当前数据包的总字节;在接收页眉时,最初收到与数据页眉大小相匹配的字节。
      • 本数据包的内容称为块。

      2. 解决方案

      如果使用 TCP Socket 通讯 。 如果所提供的数据包被粘合在一起, 而接收端无法解决问题, 我们通常会很容易地通过添加头部来解决这个问题 。 这里没有具体的必要性, 所以头部的固定大小被设为四个字节, 用来保持当前数据板的总字节 。

      2.1 发送端

      数据分四个阶段传送给发送者:
      1. N4( 4 是占住头数 ) 动态请求: N4( 4) 是占住头数 )
      2. 写入要传输到应用程序初始四字节的数据的完整长度, 该字节必须更改为网络字节顺序( 大结尾 ) 。
      3. 复制要传送到信头后面地址空间的数据, 并发送整个软件包( 字符串没有字节顺序问题 ) 。
      4. 释放申请的堆内存。
      由于发件人必须总是发送整个软件包,所以它可以创建一个发件人函数,如果当前软件包中的数据没有发送,该函数将始终发送。以下是处理代码: /*
      职能说明:转交所提供的字节数。
      函数参数:
      - fd: 通信文件说明(套)
      - 电文: 原始数据将发送
      - 大小:要交付的原始数据的字节总数。
      函数返回值: 一个成功函数调用返回发送的字节编号, 而一个失败函数调用返回 - 1 。
      */
      int writen(int fd, const char* msg, int size)
      {
      const char* buf = msg;
      int count = size;
      while(count > 0)
      {
      int len = send(fd, buf, count, 0);
      if(len == -1)
      {
      close(fd);
      return-1;
      }
      else if(len == 0)
      {
      continue;
      }
      buf  = len;
      count -= len;
      }
      returnsize;
      }
      您可以使用此功能提供袋式数据块,如下所示: /*
      提供带有使用此函数的数据头的数据包。
      函数参数:
      - 参考:通信文件说明(集)
      - 电文: 原始数据将发送
      - 交付的原始数据字节总数。
      函数返回值: 一个成功函数调用返回发送的字节编号, 而一个失败函数调用返回 - 1 。
      */
      int sendMsg(int cfd, char* msg, int len)
      {
      if(msg == NULL || len <= 0 || cfd <=0)
      {
      return-1;
      }
      / 请求的内存空间:数据长度4字节(存储数据长度)
      char* data = (char*)malloc(len 4);
      int bigLen = htonl(len);
      memcpy(data,

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/12207.html

          热门文章

          文章分类