private void PacketReceived(TcpNetworkConnection conn, byte[] packet)
 {
     lock (this.ConnectionLock)
     {
         if (this._IsConnected)
         {
             this.DeliverPacket(this.Settings.Serializer.Deserialize(packet));
         }
     }
 }
        private void EndAcceptConnection(IAsyncResult result)
        {
            lock (this.ConnectionLock)
            {
                if (this._IsOpen)
                {
                    try
                    {
                        Socket socket = this.Socket.EndAccept(result);
                        if (this.Settings.MaxConnectionCount == 0 || this._ConnectionCount < this.Settings.MaxConnectionCount)
                        {
                            int id = this.ConnectionIDCounter++;
                            if (id == 0) id = this.ConnectionIDCounter++;
                            SocketError e;

                            try
                            {
                                socket.Send(BitConverter.GetBytes(id), 0, 4, SocketFlags.None, out e);
                            }
                            catch
                            {
                                e = SocketError.SocketError;
                            }

                            if (e == SocketError.Success)
                            {
                                TcpNetworkConnection connection = new TcpNetworkConnection(id, socket, ref this.ConnectionLock);
                                connection.OnDisconnect += new Action<TcpNetworkConnection>(ConnectionDisconnected);
                                connection.OnPacketReceived += new Action<TcpNetworkConnection, byte[]>(PacketReceived);
                                connection.Connect();
                                this.Connections.Add(id, connection);
                                this._ConnectionCount++;
                                // connection.Send(new NetworkPacket { Service = -1, Targets = new int[1] { id }, Data = id });
                                if (this.OnConnectionConnected != null) this.OnConnectionConnected(this, connection);
                            }
                        }
                        else
                        {
                            try
                            {
                                socket.BeginSend(new byte[4], 0, 4, SocketFlags.None, null, null);
                            }
                            catch { }
                        }

                        this.BeginAcceptConnection();
                    }
                    catch (SocketException e)
                    {
                        this.Error(e.SocketErrorCode);
                    }
                }
            }
        }
 private void ConnectionDisconnected(TcpNetworkConnection conn)
 {
     lock (this.ConnectionLock)
     {
         if (this._IsConnected)
         {
             this.Disconnect();
         }
     }
 }
 private void ConnectionDisconnected(TcpNetworkConnection connection)
 {
     lock (this.ConnectionLock)
     {
         this.Connections.Remove(connection.ID);
         if (this.OnConnectionDisconnected != null) this.OnConnectionDisconnected(this, connection);
     }
 }