private void Clean() { try { try { if (_stream != null) { _stream.Dispose(); } } catch { } try { if (_socket != null) { _socket.Dispose(); } } catch { } } catch { } finally { _stream = null; _socket = null; } if (_receiveBuffer != default(ArraySegment <byte>)) { _configuration.BufferManager.ReturnBuffer(_receiveBuffer); } _receiveBuffer = default(ArraySegment <byte>); _receiveBufferOffset = 0; }
static void ServeSegment(RioSocket socket) { socket.SetLinger(0); var reader = new RioSegmentReader <ServeState>(socket); reader.State = new ServeState(); reader.State.leftoverLength = 0; reader.State.oldleftoverLength = 0; reader.State.reader = reader; reader.State.socket = socket; reader.OnIncommingSegment = ProcessSocket; reader.Start(); }
public TcpSocketRioSession( TcpSocketRioServerConfiguration configuration, ISegmentBufferManager bufferManager, RioSocket socket, ITcpSocketRioServerMessageDispatcher dispatcher, TcpSocketRioServer server) { if (configuration == null) { throw new ArgumentNullException("configuration"); } if (bufferManager == null) { throw new ArgumentNullException("bufferManager"); } if (socket == null) { throw new ArgumentNullException("socket"); } if (dispatcher == null) { throw new ArgumentNullException("dispatcher"); } if (server == null) { throw new ArgumentNullException("server"); } _configuration = configuration; _bufferManager = bufferManager; _socket = socket; _dispatcher = dispatcher; _server = server; _sessionKey = Guid.NewGuid().ToString(); this.StartTime = DateTime.UtcNow; if (_receiveBuffer == default(ArraySegment <byte>)) { _receiveBuffer = _bufferManager.BorrowBuffer(); } _receiveBufferOffset = 0; _stream = new RioStream(_socket); }
public async Task Close() { if (Interlocked.Exchange(ref _state, _disposed) == _disposed) { return; } try { if (_stream != null) { _stream.Dispose(); _stream = null; } if (_socket != null) { _socket.Dispose(); _socket = null; } } catch (Exception) { } if (_receiveBuffer != null) { _bufferManager.ReturnBuffer(_receiveBuffer); } _receiveBufferOffset = 0; _log.DebugFormat("Session closed on [{0}] in dispatcher [{1}] with session count [{2}].", DateTime.UtcNow.ToString(@"yyyy-MM-dd HH:mm:ss.fffffff"), _dispatcher.GetType().Name, this.Server.SessionCount - 1); try { await _dispatcher.OnSessionClosed(this); } catch (Exception ex) { HandleUserSideError(ex); } }
private async Task Process(RioSocket acceptedSocket) { var session = new TcpSocketRioSession(_configuration, _bufferManager, acceptedSocket, _dispatcher, this); if (_sessions.TryAdd(session.SessionKey, session)) { _log.DebugFormat("New session [{0}].", session); try { await session.Start(); } finally { TcpSocketRioSession recycle; if (_sessions.TryRemove(session.SessionKey, out recycle)) { _log.DebugFormat("Close session [{0}].", recycle); } } } }
static async Task Servebuff(RioSocket socket) { try { var buffer = new byte[128 * pipeLineDeph]; var leftoverLength = 0; var oldleftoverLength = 0; uint endOfRequest = 0x0a0d0a0d; uint current = 0; var stream = new RioStream(socket); while (true) { int r = await stream.ReadAsync(buffer, 0, buffer.Length); if (r == 0) { break; } for (int i = 0; leftoverLength != 0 && i < 4 - leftoverLength; i++) { current += buffer[i]; current = current << 8; if (current == endOfRequest) { stream.Write(responseBytes, 0, responseBytes.Length); } } leftoverLength = r % 4; var length = r - leftoverLength; unsafe { fixed(byte *currentPtr = &buffer[oldleftoverLength]) { var start = currentPtr; var end = currentPtr + length; for (; start <= end; start++) { if (*(uint *)start == endOfRequest) { stream.Write(responseBytes, 0, responseBytes.Length); } } } } stream.Flush(); oldleftoverLength = leftoverLength; for (int i = r - leftoverLength; i < r; i++) { current += buffer[i]; current = current << 4; } } } catch (Exception ex) { Console.WriteLine(ex); } finally { socket.Dispose(); } }
public async static Task <int> Execute() { { var buffer = new byte[256 * pipeLineDeph]; var leftoverLength = 0; var oldleftoverLength = 0; uint endOfRequest = 0x0a0d0a0d; uint current = 0; int responses = 0; int total = 0; RioSocket connection = null; RioStream stream = null; while (timer.Elapsed < span) { if (connection == null) { try { connection = await clientPool.Connect(uri); stream = new RioStream(connection); } catch (Exception) { continue; } } //check if connection is valid? connection.WriteFixed(requestBytes); while (responses < pipeLineDeph) { int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); if (bytesRead == 0) { break; } for (int i = 0; leftoverLength != 0 && i < 4 - leftoverLength; i++) { current += buffer[i]; current = current << 8; if (current == endOfRequest) { responses++; } } leftoverLength = bytesRead % 4; var length = bytesRead - leftoverLength; unsafe { fixed(byte *data = &buffer[oldleftoverLength]) { var start = data; var end = data + length; for (; start <= end; start++) { if (*(uint *)start == endOfRequest) { responses++; } } } } oldleftoverLength = leftoverLength; for (int i = bytesRead - leftoverLength; i < bytesRead; i++) { current += buffer[i]; current = current << 4; } } total += responses; responses = 0; if (!keepAlive) { stream.Dispose(); connection.Dispose(); connection = null; } } connection?.Dispose(); return(total); } }
async Task Servebuff(RioSocket socket) { }