防止粘包后导致数据无法接收的问题(C#)

防止粘包后导致数据无法接收的问题(C#)

Queue <byte> queue = new Queue<byte>();

					EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
                    byte[] buffer1 = new byte[1024];
                    int length = client.ReceiveFrom(buffer1, ref point);//接收数据报
                    int first1 = Array.IndexOf(buffer1, (byte)0xaa);
                    byte[] buffer2 = new byte[length];
                    Array.Copy(buffer1, 0, buffer2, 0, buffer2.Length);
                    int num1 = 0;
                    int num2 = 0;
                    //遍历每个数据并通过包头和包尾判断一包数据是否接收到
                    foreach (var item in buffer2)
                    {
                        if (item == 0xaa)
                        {
                            num1++;
                        }
                        if (num1 >=2 )
                        {
                            Open_queue = true;
                            queue.Enqueue(0xaa);
                            num1 = 0;
                        }

                        if (Open_queue)
                        {
                            queue.Enqueue(item);
                        }

                        if (item == '\r')
                        {
                            num2++;
                        }
                        if (item == '\n')
                        {
                            num2++;
                        }
                        if (num2 >= 2)
                        {
                            Open_queue = false;
                            num2 = 0;
                            byte[] buffer = new byte[queue.Count];
                            queue.CopyTo(buffer,0);
                            queue.Clear();
                            //最后两位为\r\n
                            byte[] check_byte = { buffer[buffer.Length - 4], buffer[buffer.Length - 3] };
                            uint[] check_uint = new uint[buffer.Length - 4];
                            for (int i = 0; i < check_uint.Length; i++)
                            {
                                check_uint[i] = buffer[i];
                            }

                            ushort check = BitConverter.ToUInt16(check_byte, 0);
                            ushort check_local = (ushort)crc32(check_uint);
                            if (!(check == check_local))
                            {
                                continue;
                            }
                            try
                            {
                                if (reciveMsg)
                                {
                                    data_receive(buffer);
                                }


                            }
                            catch
                            {

                            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值