void DoReceiveEvent(NetPacketAndBuffer packetAndBuffer) { onReceive?.Invoke(this, packetAndBuffer); ReceiveCB cb; if (onReceiveCbDict.TryGetValue(packetAndBuffer.Item1.cmd, out cb)) { cb?.Invoke(this, packetAndBuffer); } }
public NetPacketAndBuffer FetchReceivedBuffer() { if (!manuallyFetchReceivedBuffer) { return(null); } NetPacketAndBuffer packetAndBuffer = null; receiveBufferQueue.TryDequeue(out packetAndBuffer); return(packetAndBuffer); }
bool OnReceived(SocketAsyncEventArgs e, bool callReceiveWhenFinished) { if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { var headerSize = Marshal.SizeOf <NetPacketHeader>(); var remainBuffer = new NetBuffer { byteArray = e.Buffer, offset = 0, size = e.BytesTransferred }; while (remainBuffer.size > 0) { if (receivingHeaderOffset < headerSize) { var oldRemainBuffer = remainBuffer; var originHeaderOffset = receivingHeaderOffset; var remainBufferOffset = receivingHeader.ReadPartial( remainBuffer.byteArray, receivingHeaderOffset, remainBuffer.offset, remainBuffer.offset + remainBuffer.size - 1); var readBytes = remainBufferOffset - remainBuffer.offset; receivingHeaderOffset += readBytes; remainBuffer.Consume(readBytes); #if ENABLE_NET_DIAGNOSTICS Output.LogErrorFormat( "READ HEADER (CMD {0} FLAGS {1} SLCODE {2} SIZE {3}) (OFFSET {4} => {5}) (REMAIN {6} => {7}) T = {8}", receivingHeader.cmd, receivingHeader.flags, receivingHeader.slCode, receivingHeader.size, originHeaderOffset, receivingHeaderOffset, oldRemainBuffer.offset, oldRemainBuffer.offset + oldRemainBuffer.size - 1, System.Threading.Thread.CurrentThread.ManagedThreadId); #endif if (receivingHeaderOffset >= headerSize) { if (receivingHeaderOffset > headerSize || receivingHeader.size > maxReceiveBodySize) { Output.LogErrorFormat( "CORRUPT HEADER (CMD {0} FLAGS {1} SLCODE {2} SIZE {3}) (OFFSET {4} => {5}) (REMAIN {6} => {7}) T = {8}", receivingHeader.cmd, receivingHeader.flags, receivingHeader.slCode, receivingHeader.size, originHeaderOffset, receivingHeaderOffset, oldRemainBuffer.offset, oldRemainBuffer.offset + oldRemainBuffer.size - 1, System.Threading.Thread.CurrentThread.ManagedThreadId); Output.LogErrorFormat( "{0:X} {1:X} {2:X} {3:X} {4:X} {5:X} {6:X} {7:X} {8:X} {9:X}", oldRemainBuffer.byteArray[oldRemainBuffer.offset], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 1], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 2], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 3], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 4], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 5], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 6], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 7], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 8], oldRemainBuffer.byteArray[oldRemainBuffer.offset + 9] ); Close(); return(false); } receivingBuffer = new NetBuffer { byteArray = new byte[receivingHeader.size], offset = 0, size = (int)receivingHeader.size }; } } else { var byteNumToCopy = Math.Min(remainBuffer.size, receivingBuffer.size); Buffer.BlockCopy( remainBuffer.byteArray, (int)remainBuffer.offset, receivingBuffer.byteArray, (int)receivingBuffer.offset, byteNumToCopy); remainBuffer.Consume(byteNumToCopy); receivingBuffer.Consume(byteNumToCopy); } if (receivingBuffer.byteArray != null && receivingBuffer.size == 0) { var packetAndBuffer = new NetPacketAndBuffer( receivingHeader, receivingBuffer.Begin); receivingHeader = NetPacketHeader.Empty; receivingBuffer = NetBuffer.Empty; receivingHeaderOffset = 0; if (packetAndBuffer.Item2.byteArray != null) { try { if (manuallyFetchReceivedBuffer) { receiveBufferQueue.Enqueue(packetAndBuffer); } else { DoReceiveEvent(packetAndBuffer); } } catch (Exception exception) { Output.LogError(exception); } } } } if (callReceiveWhenFinished) { BeginReceive(0); } } else if (e.SocketError != SocketError.Success) { Output.LogFormat("RECV ERROR: {0}", e.SocketError); Close(); return(false); } return(true); }