static void connected(object sender, SocketAsyncEventArgs args)
        {
            Socket client = sender as Socket;
            if (args.SocketError == SocketError.Success)
            {
                Console.WriteLine("접속됨.");

                MemoryStream stream = new MemoryStream();
                BinaryWriter writer = new BinaryWriter(stream);

                writer.Write(UTF8.GetBytes(NET_AUTH));
                writer.Write(UTF8.GetBytes(NET_AUTH_TOKEN).Length);
                writer.Write(UTF8.GetBytes(NET_AUTH_TOKEN));

                client.Send(stream.ToArray());

                SocketData data = new SocketData();
                data.initData(SETTING_DATA_SIZE);

                SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs();
                recvArgs.UserToken = data;
                recvArgs.SetBuffer(data.data, 0, SETTING_DATA_SIZE);
                recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(receiveCompleted);

                client.ReceiveAsync(recvArgs);
            }
            else
                Console.WriteLine(args.SocketError.ToString());
        }
        private void receiveCompleted(object sender, SocketAsyncEventArgs args)
        {
            Socket clientSock = sender as Socket;
            SocketData data = args.UserToken as SocketData;
            Client client = data.client;

            if (client == null)
            {
                return;
            }

            if (args.SocketError == SocketError.ConnectionReset)
            {
                disconnectClient(client, true);
            }

            client.lastConn = DateTime.Now;

            if (clientSock.Connected && args.BytesTransferred > 0)
            {
                data.data = args.Buffer;

                if (!client.authed)
                {
                    if (data.code == NET_AUTH)
                    {
                        int len = BitConverter.ToInt32(data.data, 8);
                        string token = UTF8.GetString(data.data, 12, len);

                        StreamWriter.Write(UTF8.GetBytes(NET_AUTH));

                        if (token == NET_AUTH_TOKEN)
                        {
                            client.authed = true;
                            Console.WriteLine($"클라이언트 {clientSock.RemoteEndPoint.ToString()} 인증됨.");
                            StreamWriter.Write(0x00000001);
                        }
                        else
                        {
                            Console.WriteLine($"클라이언트 {clientSock.RemoteEndPoint.ToString()} 인증 실패");
                            StreamWriter.Write(0xFFFFFFFF);
                            disconnectClient(client);
                        }

                        SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();
                        sendArgs.SetBuffer(UtilStream.ToArray(), 0, UtilStreamLength);

                        clientSock.SendAsync(sendArgs);

                        resetSW();
                    }
                }
                else
                {
                    switch (data.code)
                    {
                        case NET_LIST:
                            {
                                SendList(client);
                                break;
                            }
                    }
                }

                data = new SocketData();
                data.client = client;
                data.initData(SETTING_DATA_SIZE);

                args.UserToken = data;
                args.SetBuffer(data.data, 0, SETTING_DATA_SIZE);

                clientSock.ReceiveAsync(args);
            }
        }
        static void receiveCompleted(object sender, SocketAsyncEventArgs args)
        {
            Socket client = sender as Socket;
            SocketData data = args.UserToken as SocketData;

            data.data = args.Buffer;

            if (client == null)
                return;

            if (client.Connected && args.BytesTransferred > 0)
            {
                SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs();

                switch (data.code)
                {
                    case NET_ALIVE:
                        {
                            sendArgs.SetBuffer(UTF8.GetBytes(NET_ALIVE), 0, 8);
                            client.SendAsync(sendArgs);
                            break;
                        }
                    case NET_AUTH:
                        {
                            int state = BitConverter.ToInt32(data.data, 8);

                            if (state == 1)
                            {
                                Console.WriteLine("인증 성공!");
                                authed = true;
                            }
                            else
                            {
                                Console.WriteLine("인증 실패.");
                                authed = false;
                            }

                            break;
                        }
                    case NET_LIST:
                        {
                            int len = BitConverter.ToInt32(data.data, 8);
                            XElement xml = XElement.Parse(UTF8.GetString(data.data, 12, len));

                            Console.WriteLine(xml.ToString());
                            break;
                        }
                }
            }

            data = new SocketData();
            data.initData(SETTING_DATA_SIZE);

            args.UserToken = data;
            args.SetBuffer(data.data, 0, SETTING_DATA_SIZE);

            client.ReceiveAsync(args);
        }
        private void acceptSocket(object sender, SocketAsyncEventArgs args)
        {
            if (args.SocketError != SocketError.Success)
            {
                return;
            }

            Socket server = sender as Socket;
            Socket clientSock = args.AcceptSocket;

            if (clientSock != null && clientSock is Socket)
            {
                Console.WriteLine($"클라이언트 {clientSock.RemoteEndPoint.ToString()} 접속");
                Client client = new Client();
                client.socket = clientSock;
                client.lastConn = DateTime.Now;

                SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs();

                SocketData data = new SocketData(client);

                data.initData(SETTING_DATA_SIZE);

                recvArgs.UserToken = data;
                recvArgs.SetBuffer(data.data, 0, SETTING_DATA_SIZE);
                recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(receiveCompleted);

                clientSock.ReceiveAsync(recvArgs);

                clientList.Add(client);
            }

            args.AcceptSocket = null;
            server.AcceptAsync(args);
        }