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); } }
/// <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); }
/// <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); } }