internal TcpClient(Socket socket, TcpServer server, IPacketPropagator propagator) { Contract.Requires(socket != null); Contract.Requires(server != null); Contract.Requires(propagator != null); Contract.Ensures(Server == server); _socket = socket; _eventArgs = SocketAsyncEventArgsPool.Acquire(); _headerBuffer = new byte[propagator.IncomingHeaderLength]; _receiveBuffer = new byte[InitialReceiveBufferSize]; // Start out with a 2 ^ 16 - 1 buffer. _propagator = propagator; Server = server; UserData = new Bag(); // Start receiving packets... Receive(); Contract.Assume(Server == server); }
/// <summary> /// Starts accepting incoming clients. /// </summary> /// <param name="args">The async event args to use, if any (passing null /// will create a new object).</param> private void Accept(SocketAsyncEventArgs args) { if (args == null) { args = SocketAsyncEventArgsPool.Acquire(); args.Completed += OnAccept; } else { args.AcceptSocket = null; } try { if (!_socket.AcceptAsync(args)) { OnAccept(this, args); } } catch (Exception ex) { args.Completed -= OnAccept; SocketAsyncEventArgsPool.Release(args); if (ex is ObjectDisposedException) { return; } if (ex is SocketException) { ExceptionManager.RegisterException(ex); return; } throw; } }
private void OnSend(object sender, SocketAsyncEventArgs args) { args.Completed -= OnSend; SocketAsyncEventArgsPool.Release(args); }