Exemplo n.º 1
0
        void DoReceiveEvent(NetPacketAndBuffer packetAndBuffer)
        {
            onReceive?.Invoke(this, packetAndBuffer);

            ReceiveCB cb;

            if (onReceiveCbDict.TryGetValue(packetAndBuffer.Item1.cmd, out cb))
            {
                cb?.Invoke(this, packetAndBuffer);
            }
        }
Exemplo n.º 2
0
        public NetPacketAndBuffer FetchReceivedBuffer()
        {
            if (!manuallyFetchReceivedBuffer)
            {
                return(null);
            }

            NetPacketAndBuffer packetAndBuffer = null;

            receiveBufferQueue.TryDequeue(out packetAndBuffer);

            return(packetAndBuffer);
        }
Exemplo n.º 3
0
        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);
        }