Ejemplo n.º 1
0
 private void ReceiveBody(ReceiveBuffer buffer)
 {
     lock (_connection)
     {
         _connection.BeginReceive(buffer.Buffer, buffer.ReceivedBytes, buffer.Buffer.Length, SocketFlags.None,
                                  _readBodyCallback, buffer);
     }
 }
Ejemplo n.º 2
0
        private void ReceiveBody(int size)
        {
            var buffer = ReceiveBuffer.Create(size);

            lock (_connection)
            {
                _connection.BeginReceive(buffer.Buffer, buffer.ReceivedBytes, buffer.Buffer.Length, SocketFlags.None,
                                         _readBodyCallback, buffer);
            }
        }
Ejemplo n.º 3
0
        private void ReceiveHeader()
        {
            var buffer = ReceiveBuffer.Create(4);

            lock (_connection)
            {
                _connection.BeginReceive(buffer.Buffer, buffer.ReceivedBytes, buffer.Buffer.Length, SocketFlags.None,
                                         _readHeaderCallback, buffer);
            }
        }
Ejemplo n.º 4
0
        private void ReadHeaderCallback(IAsyncResult result)
        {
            int receivedBytes = 0;

            try
            {
                lock (_connection)
                {
                    receivedBytes = _connection.EndReceive(result);
                }
            }
            catch (ObjectDisposedException)
            {
                return;
            }
            catch (Exception)
            {
                HandleDisconnection();
                ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
                return;
            }

            if (receivedBytes == 0)
            {
                HandleDisconnection();
                ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
                return;
            }

            var buffer = (ReceiveBuffer)result.AsyncState;

            buffer.ReceivedBytes += receivedBytes;

            if (buffer.ReceivedBytes < buffer.Buffer.Length)
            {
                try
                {
                    ReceiveHeader(buffer);
                }
                catch (Exception)
                {
                    HandleDisconnection();
                    ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
                    return;
                }
            }
            else
            {
                Debug.Assert(buffer.ReceivedBytes == 4);
                var bytes  = buffer.Buffer;
                int length = (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3];
                ReceiveBody(length);
                ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
            }
        }
Ejemplo n.º 5
0
        private void ReadBodyCallback(IAsyncResult result)
        {
            int receivedBytes = 0;

            try
            {
                lock (_connection)
                {
                    receivedBytes = _connection.EndReceive(result);
                }
            }
            catch (ObjectDisposedException)
            {
                return;
            }
            catch (Exception)
            {
                HandleDisconnection();
                ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
                return;
            }

            if (receivedBytes == 0)
            {
                HandleDisconnection();
                ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
                return;
            }

            var buffer = (ReceiveBuffer)result.AsyncState;

            buffer.ReceivedBytes += receivedBytes;

            if (buffer.ReceivedBytes < buffer.Buffer.Length)
            {
                try
                {
                    ReceiveBody(buffer);
                }
                catch (Exception)
                {
                    HandleDisconnection();
                    ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
                    return;
                }
            }
            else
            {
                ReceiveHeader();

                _onDataCallback?.Invoke(buffer.Buffer);
                ReceiveBuffer.Release((ReceiveBuffer)result.AsyncState);
            }
        }