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); } } }