예제 #1
0
 private void Parse(MessageFactoryContext context, string message, int offset)
 {
     byte[] bytes = Encoding.ASCII.GetBytes(message);
     if (offset == 0)
     {
         context.Parse(bytes, 0, bytes.Length);
     }
     else
     {
         context.Parse(bytes, 0, offset);
         context.Parse(bytes, offset, bytes.Length - offset);
     }
 }
예제 #2
0
        /// <summary>
        /// Parse all complete requests in buffer.
        /// </summary>
        /// <param name="bytesLeft"></param>
        /// <returns>offset in buffer where parsing stopped.</returns>
        /// <exception cref="InvalidOperationException">Parsing failed.</exception>
        private int ParseBuffer(int bytesLeft)
        {
            int offset = MessageFactoryContext.Parse(_buffer, 0, bytesLeft);

            bytesLeft -= offset;

            // try another pass if we got bytes left.
            if (bytesLeft <= 0)
            {
                return(offset);
            }

            // Continue until offset is not changed.
            int oldOffset = 0;

            while (offset != oldOffset)
            {
                oldOffset = offset;
                _logger.Trace("Parsing from index " + offset + ", " + bytesLeft + " bytes.");
                offset     = MessageFactoryContext.Parse(_buffer, offset, bytesLeft);
                bytesLeft -= offset;
            }
            return(offset);
        }
예제 #3
0
        /// <summary>
        /// Received a message from remote end point.
        /// </summary>
        /// <param name="ar"></param>
        private void OnRead(IAsyncResult ar)
        {
            var      buffer    = (byte[])ar.AsyncState;
            EndPoint endPoint  = new IPEndPoint(IPAddress.Any, 3929);
            int      bytesRead = 0;

            bool isKeepAlive = true;

            try
            {
                _logger.Trace("_socket.EndReceiveFrom");
                bytesRead = _socket.EndReceiveFrom(ar, ref endPoint);
                if (bytesRead <= 4)
                {
                    for (int i = 0; i < bytesRead; ++i)
                    {
                        if (buffer[i] != '\r' && buffer[i] != '\n')
                        {
                            isKeepAlive = false;
                            break;
                        }
                    }
                }
                else
                {
                    isKeepAlive = false;
                }

                if (!isKeepAlive)
                {
                    _logger.Debug("Received " + bytesRead + " bytes from " + endPoint + ":\r\n" +
                                  Encoding.ASCII.GetString(buffer, 0, bytesRead));
                }
            }
            catch (Exception err)
            {
                _logger.Warning("EndReceiveFrom failed: " + err);
            }


            // begin receiving another packet before starting to process this one
            byte[] newBuffer = BufferPool.Dequeue();

            try
            {
                EndPoint localEndPoint = new IPEndPoint(_listeningPoint.Address, _listeningPoint.Port);
                _socket.BeginReceiveFrom(newBuffer, 0, newBuffer.Length, SocketFlags.None,
                                         ref localEndPoint, OnRead, newBuffer);
            }
            catch (Exception err)
            {
                _logger.Warning("BeginReceiveFrom failed, closing socket. Exception: " + err);
                BufferPool.Enqueue(newBuffer);
                BufferPool.Enqueue(buffer);
                _socket.Close();
                return;
            }

            if (bytesRead == 0 || isKeepAlive)
            {
                BufferPool.Enqueue(buffer);
                return;
            }

            // Parse buffer.
            MessageFactoryContext factoryContext = _parsers.CreateNewContext(endPoint);

            try
            {
                int offset = factoryContext.Parse(buffer, 0, bytesRead);
                if (offset != bytesRead)
                {
                    _logger.Error("Failed to parse complete message");
                }
            }
            finally
            {
                BufferPool.Enqueue(buffer);
                _parsers.Release(factoryContext);
            }
        }