internal TcpConnection(IntPtr socket, long connectionId, WorkBundle wb, RIO rio) { _socket = socket; _connectionId = connectionId; _rio = rio; _wb = wb; _requestQueue = _rio.CreateRequestQueue(_socket, MaxPendingReceives, 1, MaxPendingSends, 1, wb.completionQueue, wb.completionQueue, connectionId); if (_requestQueue == IntPtr.Zero) { var error = RIOImports.WSAGetLastError(); RIOImports.WSACleanup(); throw new Exception(String.Format("ERROR: CreateRequestQueue returned {0}", error)); } _receiveTasks = new ReceiveTask[MaxPendingReceives]; _receiveRequestBuffers = new ArraySegment <byte> [MaxPendingReceives]; for (var i = 0; i < _receiveTasks.Length; i++) { _receiveTasks[i] = new ReceiveTask(this, wb.bufferPool.GetBuffer()); } _sendSegments = new PooledSegment[MaxPendingSends]; for (var i = 0; i < _sendSegments.Length; i++) { _sendSegments[i] = wb.bufferPool.GetBuffer(); } wb.connections.TryAdd(connectionId, this); for (var i = 0; i < _receiveTasks.Length; i++) { PostReceive(i); } }
internal TcpConnection(IntPtr socket, long connectionId, WorkBundle wb, RIO rio) { _socket = socket; _connectionId = connectionId; _rio = rio; _wb = wb; _requestQueue = _rio.CreateRequestQueue(_socket, MaxPendingReceives, 1, MaxPendingSends, 1, wb.completionQueue, wb.completionQueue, connectionId); if (_requestQueue == IntPtr.Zero) { var error = RIOImports.WSAGetLastError(); RIOImports.WSACleanup(); throw new Exception(String.Format("ERROR: CreateRequestQueue returned {0}", error)); } _receiveTasks = new ReceiveTask[MaxPendingReceives]; _receiveRequestBuffers = new ArraySegment<byte>[MaxPendingReceives]; for (var i = 0; i < _receiveTasks.Length; i++) { _receiveTasks[i] = new ReceiveTask(this, wb.bufferPool.GetBuffer()); } _sendSegments = new PooledSegment[MaxPendingSends]; for (var i = 0; i < _sendSegments.Length; i++) { _sendSegments[i] = wb.bufferPool.GetBuffer(); } wb.connections.TryAdd(connectionId, this); for (var i = 0; i < _receiveTasks.Length; i++) { PostReceive(i); } }