예제 #1
0
        private void RecivePacketFromClient(IAsyncResult ar)
        {
            lock (locker)
            {
                Socket session = (Socket)ar.AsyncState;
                Client client  = ClientFactory.Instance.GetClientBySession(session);
                if (client == null)
                {
                    return;
                }
                int recived = 0;
                try
                {
                    recived = session.EndReceive(ar);
                }
                catch (Exception e)
                {
                    // Client has disconnected
                    if (client == null)
                    {
                        Console.WriteLine($"Error occur {e.Message}");
                    }
                    else
                    {
                        ClientFactory.Instance.RemoveClient(client);
                        session.Shutdown(SocketShutdown.Both);

                        Console.WriteLine(session.RemoteEndPoint + " Has been disconnected");
                        client.Logout();
                        if (!string.IsNullOrEmpty(client.NickName))
                        {
                            foreach (var c in ClientFactory.Instance.GetAllClients().Where(x => x != client))
                            {
                                c.Announce(PacketCreator.SendUserUpdate(client.NickName, 2));
                            }
                        }
                        session = null;
                    }
                    return;
                }
                byte[]        packet  = GetBytes(recived);
                PacketReader  reader  = new PacketReader(packet);
                short         header  = reader.ReadShort();
                PacketHandler handler = PacketProccessor.GetHandler(header);
                Console.WriteLine("Packet ID is : " + header);
                if (handler != null)
                {
                    handler.handlePacket(reader, client);
                }
                else
                {
                    Console.WriteLine($"Error, No Such Header was found, Header : {header}");
                }
                BeginRecive(session);
            }
        }
예제 #2
0
        public Server()
        {
            Database.DatabaseManager.Instance.InitDatabase();
            Console.WriteLine("Starting Server!");
            //Register Handlers
            int amount = PacketProccessor.InitPackets();

            Console.WriteLine($"{amount} Handler(s) has been registered!");
            Thread.Sleep(100);
#pragma warning disable CS0618 // Type or member is obsolete
            string myIp = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
#pragma warning restore CS0618 // Type or member is obsolete
            Console.WriteLine($"Host : {myIp}");
            _server.Bind(new IPEndPoint(IPAddress.Any, ServerConstants.PORT));
            _server.Listen(5);

            Console.WriteLine($"Server is listening on port {ServerConstants.PORT}");
            _server.BeginAccept(new AsyncCallback(OnClientAccpet), null);
        }