示例#1
0
        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);
        }
示例#2
0
        /// <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;
            }
        }
示例#3
0
 private void OnSend(object sender, SocketAsyncEventArgs args)
 {
     args.Completed -= OnSend;
     SocketAsyncEventArgsPool.Release(args);
 }