Beispiel #1
0
        /// <summary>
        /// A header is received =>
        /// * Read the body if present
        /// * Send the response header
        /// * Send the body if present
        /// * Start receiving again
        /// </summary>
        /// <param name="sender" />
        /// <param name="e" />
        void OnReceive(object sender, SocketAsyncEventArgs e)
        {
            try
            {
                if (ReceiveMutex != null)
                {
                    ReceiveMutex.Wait();
                }

                // ends when error occur
                if (e.SocketError != SocketError.Success)
                {
                    return;
                }

                // ends request header transfer
                var socket     = sender as Socket;
                int transfered = e.BytesTransferred;
                while (transfered < MemcacheRequestHeader.Size && !_disposed)
                {
                    transfered += socket.Receive(e.Buffer, transfered, MemcacheRequestHeader.Size - transfered, SocketFlags.None);
                }

                // read the request header
                var header = new MemcacheRequestHeader();
                header.FromData(e.Buffer);
                LastReceivedHeader = header;

                // transfer the body is present
                if (header.TotalBodyLength > 0)
                {
                    var body = new byte[header.TotalBodyLength];
                    transfered = 0;

                    while (transfered < header.TotalBodyLength && !_disposed)
                    {
                        transfered += socket.Receive(body, transfered, (int)header.TotalBodyLength - transfered, SocketFlags.None);
                    }

                    LastReceivedBody = body;
                }
                else
                {
                    LastReceivedBody = null;
                }

                // send the response header
                transfered = 0;
                while (transfered < MemcacheResponseHeader.Size && !_disposed)
                {
                    var toTransfer = MemcacheResponseHeader.Size - transfered;
                    if (MaxSent != 0 && MaxSent < toTransfer)
                    {
                        toTransfer = MaxSent;
                    }
                    transfered += socket.Send(ResponseHeader, transfered, toTransfer, SocketFlags.None);
                }

                // send the response body if present
                if (ResponseBody != null)
                {
                    transfered = 0;
                    while (transfered < ResponseBody.Length && !_disposed)
                    {
                        var toTransfer = ResponseBody.Length - transfered;
                        if (MaxSent != 0 && MaxSent < toTransfer)
                        {
                            toTransfer = MaxSent;
                        }
                        transfered += socket.Send(ResponseBody, transfered, toTransfer, SocketFlags.None);
                    }
                }

                // start to receive again
                if (!_disposed)
                {
                    socket.ReceiveAsync(e);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception raised in ServerMock.OnReceive : " + ex);
                LastException = ex;
            }
        }
Beispiel #2
0
        /// <summary>
        /// A header is received =>
        /// * Read the body if present
        /// * Send the response header
        /// * Send the body if present
        /// * Start receiving again
        /// </summary>
        /// <param name="sender" />
        /// <param name="e" />
        void OnReceive(object sender, SocketAsyncEventArgs e)
        {
            try
            {
                if (ReceiveMutex != null)
                {
                    ReceiveMutex.Wait();
                }

                // ends when error occur
                if (e.SocketError != SocketError.Success)
                    return;

                // ends request header transfer
                var socket = sender as Socket;
                int transfered = e.BytesTransferred;
                while (transfered < MemcacheRequestHeader.Size && !_disposed)
                    transfered += socket.Receive(e.Buffer, transfered, MemcacheRequestHeader.Size - transfered, SocketFlags.None);

                // read the request header
                var header = new MemcacheRequestHeader();
                header.FromData(e.Buffer);
                LastReceivedHeader = header;

                // transfer the body is present
                if (header.TotalBodyLength > 0)
                {
                    var body = new byte[header.TotalBodyLength];
                    transfered = 0;

                    while (transfered < header.TotalBodyLength && !_disposed)
                        transfered += socket.Receive(body, transfered, (int)header.TotalBodyLength - transfered, SocketFlags.None);

                    LastReceivedBody = body;
                }
                else
                    LastReceivedBody = null;

                // send the response header
                transfered = 0;
                while (transfered < MemcacheResponseHeader.Size && !_disposed)
                {
                    var toTransfer = MemcacheResponseHeader.Size - transfered;
                    if (MaxSent != 0 && MaxSent < toTransfer)
                        toTransfer = MaxSent;
                    transfered += socket.Send(ResponseHeader, transfered, toTransfer, SocketFlags.None);
                }

                // send the response body if present
                if (ResponseBody != null)
                {
                    transfered = 0;
                    while (transfered < ResponseBody.Length && !_disposed)
                    {
                        var toTransfer = ResponseBody.Length - transfered;
                        if (MaxSent != 0 && MaxSent < toTransfer)
                            toTransfer = MaxSent;
                        transfered += socket.Send(ResponseBody, transfered, toTransfer, SocketFlags.None);
                    }
                }

                // start to receive again
                if (!_disposed)
                    socket.ReceiveAsync(e);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception raised in ServerMock.OnReceive : " + ex);
                LastException = ex;
            }
        }