Exemple #1
0
        private unsafe bool ProcessReceice(SocketAsyncEventArgs e, LinkInfo link)
        {
            //lock (link)
            {
                var pi = e.ReceiveMessageFromPacketInfo;
                if (e.BytesTransferred == 0)
                {
                    //接收0转过去的,这个e不给他回收
                    ProcessRecvZero(link);
                    return(true);
                }
                if (option.WithPackageLength16M == false)
                {
                    byte[] data = new byte[e.BytesTransferred];
                    fixed(byte *src = e.Buffer, dest = data)
                    {
                        System.Buffer.MemoryCopy(src + e.Offset, dest, e.BytesTransferred, e.BytesTransferred);
                    }

                    this.OnRecv(link.Handle, data);
                }
                else
                {
                    var seek = 0;
                    while (seek < e.BytesTransferred)
                    {
                        if (link.lastPackageSize == 0)//fill len
                        {
                            if (link.lastPackageSizeSeek == 0)
                            {
                                if (e.BytesTransferred - seek >= 4)//长度字节数够了
                                {
                                    link.lastPackageSize = BitConverter.ToUInt32(e.Buffer, e.Offset + seek);
                                    seek                += 4;
                                    link.lastPackege     = new byte[link.lastPackageSize];
                                    link.lastPackegeSeek = 0;
                                    if (link.lastPackageSize > 16 * 1024 * 1024)
                                    {
                                        throw new Exception("err package size is too big");
                                    }
                                }
                                else //长度不够,读部分长度
                                {
                                    link.lastPackageSizeSeek = (byte)(e.BytesTransferred - seek);
                                    link.lastPackageSizeBuf  = new byte[4];
                                    for (var i = 0; i < link.lastPackageSizeSeek; i++)
                                    {
                                        link.lastPackageSizeBuf[i] = e.Buffer[seek + i];
                                    }
                                    seek += (int)link.lastPackageSizeSeek;
                                    continue;//不够长跳出逻辑
                                }
                            }
                            else //长度不完整,接着读
                            {
                                var len = (byte)Math.Min(4 - link.lastPackageSizeSeek, e.BytesTransferred - seek);
                                for (var i = 0; i < len; i++)
                                {
                                    link.lastPackageSizeBuf[link.lastPackageSizeSeek + i] =
                                        e.Buffer[e.Offset + seek + i];
                                }
                                seek += len;
                                link.lastPackageSizeSeek += len;
                                if (link.lastPackageSizeSeek == 4)
                                {
                                    link.lastPackageSizeSeek = 0;
                                    link.lastPackageSize     = BitConverter.ToUInt32(link.lastPackageSizeBuf, 0);
                                    link.lastPackege         = new byte[link.lastPackageSize];
                                    link.lastPackegeSeek     = 0;
                                }
                                else
                                {
                                    continue;//不够长跳出逻辑
                                }
                            }
                        }
                        if (seek < e.BytesTransferred)//fill package
                        {
                            var len = (uint)Math.Min(link.lastPackageSize - link.lastPackegeSeek, e.BytesTransferred - seek);
                            fixed(byte *src = e.Buffer, dest = link.lastPackege)
                            {
                                System.Buffer.MemoryCopy(src + e.Offset + seek, dest + link.lastPackegeSeek, e.BytesTransferred, len);
                            }

                            link.lastPackegeSeek += len;
                            seek += (int)len;
                        }
                        if (link.lastPackegeSeek == link.lastPackageSize)//finish package
                        {
                            link.lastPackageSize = 0;
                            link.lastPackegeSeek = 0;
                            this.OnRecv(link.Handle, link.lastPackege);
                        }
                    }
                }
                try
                {
                    var asyncr = link.Socket.ReceiveAsync(link.recvArgs);
                    return(asyncr);
                }
                catch (Exception err)
                {
                    logger.Error("error ProcessReceice. continue." + e.SocketError);
                    return(true);
                }
            }
        }