zoukankan      html  css  js  c++  java
  • socket粘包、断包、校验

     1 try
     2 {
     3     byte[] buffer = UDPClient.Receive(ref _udpOpto.localPoint);
     4     numberOfBytesRead = 0;
     5     numberOfBytesRead = buffer.Length;
     6     receiveBuffer = new byte[numberOfBytesRead];                    
     7     Array.Copy(buffer, 0, receiveBuffer, 0, numberOfBytesRead);
     8     Array.Clear(buffer, 0, receiveBuffer.Length);
     9 
    10     //断包处理
    11     if (bodyWriteIndex > 0)
    12     {
    13         int writeLength = Math.Min(bodyLength, numberOfBytesRead);
    14         Array.Copy(receiveBuffer, 0, bodyBuffer, bodyWriteIndex, writeLength);
    15         readIndex += writeLength;
    16         bodyWriteIndex += writeLength;
    17     }
    18     //新包/粘包
    19     else
    20     {
    21         //验证帧头
    22         string s = BitConverter.ToString(receiveBuffer).Replace("-", "");
    23         int i = s.IndexOf("AA01");
    24         if (i != 0)
    25         {
    26             return;
    27         }
    28         int writeLength = Math.Min(bodyLength, numberOfBytesRead - readIndex);
    29         bodyBuffer = new byte[bodyLength];
    30         Array.Copy(receiveBuffer, readIndex, bodyBuffer, 0, writeLength);
    31         readIndex += writeLength;
    32         bodyWriteIndex += writeLength;
    33     }
    34     Array.Clear(receiveBuffer, 0, receiveBuffer.Length);
    35                     
    36     //完成一个包
    37     if (bodyWriteIndex == bodyLength)
    38     {
    39         readIndex = 0;
    40         bodyWriteIndex = 0;
    41         //验收帧头
    42         string s = BitConverter.ToString(bodyBuffer).Replace("-", "");
    43         int dh = s.IndexOf("AA01");        
    44         if (dh == 0)
    45         {
    46             int dSum = 0;
    47             for (int i = 0; i<bodyBuffer.Length - 1; i++)
    48             {
    49                 dSum += bodyBuffer[i];
    50             }
    51             //验证校验码
    52             if (dSum % 256 == bodyBuffer[82])
    53             {
    54                 xxModel pm = bufferToModel(bodyBuffer);
    55                 Array.Clear(bodyBuffer, 0, bodyBuffer.Length);
    56                 //异步
    57                 Task.Run(() =>
    58                 {
    59                     //存储
    60                 });
    61             }
    62         }
    63     }
    64 }
    65 catch (ThreadAbortException ex)
    66 {
    67     //不作处理          
    68 }
    69 catch (Exception ex)
    70 {
    71     LogHelper.WriteLog(LogFile.Error, "[错误信息]:" + ex.ToString());
    72 }
  • 相关阅读:
    Kubernetes 命令行工具之kubctl
    新一代数据库之Etcd 简介
    算法题 打家劫舍(动态规划)
    算法题 位1的个数
    Class强制类型转换
    算法题 阶乘后的零
    算法题 Excel表列序号
    多数元素
    有序数组两数之和
    一杯果汁和一杯水的故事
  • 原文地址:https://www.cnblogs.com/X-Jonney/p/14029355.html
Copyright © 2011-2022 走看看