Example #1
0
        public void Send(NetPacketHeader header, NetBuffer buffer)
        {
            header.size = (uint)buffer.size;

            var headerSize      = Marshal.SizeOf(header);
            var headerByteArray = new byte[Marshal.SizeOf(header)];

            header.Write(headerByteArray, 0, headerSize - 1);

            lock (combineSendLock)
            {
                Send(headerByteArray, 0, headerByteArray.Length);
                if (buffer.size != 0)
                {
                    Send(buffer);
                }
            }
        }
Example #2
0
        public static int ReadList(List <NetPacketHeader> sValArray, byte[] byteArray, int begin, int end)
        {
            if (end - begin + 1 < 4)
            {
                throw new NoSufficentSpaceException(4, begin, end);
            }
            int size   = System.BitConverter.ToInt32(byteArray, begin);
            int length = size / 10;

            sValArray.Clear();
            sValArray.Capacity = length;
            begin += 4;

            if (end - begin + 1 < size)
            {
                throw new NoSufficentSpaceException(10 * length, begin, end);
            }
            int offset = begin;

            for (int i = 0; i < length; ++i)
            {
                var value = new NetPacketHeader();
                value.b00 = byteArray[offset + 0];
                value.b01 = byteArray[offset + 1];
                value.b02 = byteArray[offset + 2];
                value.b03 = byteArray[offset + 3];
                value.b04 = byteArray[offset + 4];
                value.b05 = byteArray[offset + 5];
                value.b06 = byteArray[offset + 6];
                value.b07 = byteArray[offset + 7];
                value.b08 = byteArray[offset + 8];
                value.b09 = byteArray[offset + 9];
                sValArray.Add(value);
                offset += 10;
            }
            return(offset);
        }
Example #3
0
        void BeginSend(NetBuffer buffer, bool forceSend)
        {
            lock (sendLock)
            {
                if (sending && !forceSend)
                {
#if ENABLE_NET_DIAGNOSTICS
                    buffer.index = _bufferIndex;
                    _bufferIndex++;
#endif
                    sendBufferQueue.Enqueue(buffer);
                    return;
                }
                else
                {
                    sending = true;
                }
            }

            if (sendEventArgs == null)
            {
                sendEventArgs            = new SocketAsyncEventArgs();
                sendEventArgs.Completed += OnIOComplete;
            }

            sendEventArgs.SetBuffer(buffer.byteArray, buffer.offset, buffer.size);

            sendingBuffer = buffer;

            while (true)
            {
#if ENABLE_NET_DIAGNOSTICS
                Output.LogFormat("SEND <{0} {1}> {2} T = {3}",
                                 sendingBuffer.offset, sendingBuffer.size,
                                 sendingBuffer.index,
                                 System.Threading.Thread.CurrentThread.ManagedThreadId);

                if (sendingBuffer.size == 10)
                {
                    NetPacketHeader dummyHeader = new NetPacketHeader();

                    dummyHeader.Read(sendingBuffer.byteArray, sendingBuffer.offset, sendingBuffer.size);

                    Output.LogFormat("HEADER CMD = {0}, SIZE = {1}", dummyHeader.cmd, dummyHeader.size);
                }
#endif
                if (!socket.Connected || socket.SendAsync(sendEventArgs))
                {
                    break;
                }

                if (!OnSent(sendEventArgs, false, out sendingBuffer))
                {
                    break;
                }

                if (sendingBuffer.size == 0)
                {
                    break;
                }

                sendEventArgs.SetBuffer(sendingBuffer.byteArray, sendingBuffer.offset, sendingBuffer.size);
            }
        }
Example #4
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);
        }