Ejemplo n.º 1
0
 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
 {
     WSA.Close_Socket(UDP_socket);
     WSA.Close_Socket(TCP_socket);
     socketFlag = false;
     foreach (IntPtr sock in clients.Keys)
     {
         WSA.Close_Socket(sock);
     }
     WSA.WSA_Cleanup();
 }
Ejemplo n.º 2
0
 void stop_server()
 {
     WSA.Close_Socket(UDP_socket);
     log_txt.Text += "\r\nUDP сокет уничтожен";
     WSA.Close_Socket(TCP_socket);
     log_txt.Text += "\r\nTCP сокет уничтожен";
     lock (clients)
         foreach (IntPtr sock in clients.Keys)
         {
             WSA.Close_Socket(sock);
         }
 }
Ejemplo n.º 3
0
        void listen_tcp()
        {
            IntPtr accSocket;

            WSA.sockaddr client = new WSA.sockaddr();
            while (socketFlag)
            {
                accSocket = WSA.Accept(TCP_socket);
                if (accSocket != new IntPtr(-1))
                {
                    int    Size   = Marshal.SizeOf(client);
                    int    result = WSA.getpeername(accSocket, ref client, ref Size);
                    string ip     = new IPAddress(BitConverter.GetBytes(client.sin_addr)).ToString();
                    int    iResult;
                    byte[] recvBuff = new byte[512];
                    int    tv       = 2000;
                    int    li       = WSA.setsockopt(accSocket, 65535, 4102, ref tv, Marshal.SizeOf(tv));
                    iResult = WSA.Recv(accSocket, recvBuff, 512, 0);
                    string Source = Encoding.Default.GetString(recvBuff);
                    if (regexFunc(@"IYOUCLIENT", Source) != "IYOUCLIENT")
                    {
                        WSA.Close_Socket(accSocket);
                        continue;
                    }
                    tv = 2000;
                    li = WSA.setsockopt(accSocket, 65535, 4102, ref tv, Marshal.SizeOf(tv));
                    Client cclient;
                    cclient.ip          = ip;
                    cclient.socket      = accSocket.ToString();
                    cclient.game_status = 0;
                    cclient.game_bill   = 0;
                    clients.Add(accSocket, cclient);
                    Update_list();
                    AddTextSafe("Подключился клиент:" + accSocket.ToString());
                    new Thread(delegate() { recvClientTCP(accSocket); }).Start();
                    if (currentWord != "")
                    {
                        lock (command_risovalko_log)
                            foreach (string str in command_risovalko_log)
                            {
                                sendTCP(accSocket, str);
                            }
                    }
                }
            }
        }
Ejemplo n.º 4
0
        void recvClientTCP(IntPtr client)
        {
            string Source;

            while (true)
            {
                byte[] recvBuff = new byte[512];
                int    iResult;
                iResult = WSA.Recv(client, recvBuff, 512, 0);
                if (iResult > 0)
                {
                    Source = Encoding.Default.GetString(recvBuff);
                    if (regexFunc(@"IAMHERETOO", Source) == "IAMHERETOO")
                    {
                        int tv = 2000;
                        WSA.setsockopt(client, 65535, 4102, ref tv, Marshal.SizeOf(tv));
                        tv = 0;
                        continue;
                    }
                    if ((Convert.ToInt32(regexFunc(@"CommandType=[0-9]", Source).Substring(12)) == 0))
                    {
                        string str = regexFunc(@"Text=\W\w+", Source);
                        if (str.Length > 0)
                        {
                            if (str.Substring(5) == "!start")
                            {
                                lock (command_risovalko_log)
                                    command_risovalko_log.Clear();
                                lock (clients)
                                {
                                    Random r        = new Random();
                                    int    i        = 0;
                                    int    needed_i = r.Next(clients.Count);
                                    foreach (IntPtr sock in clients.Keys)
                                    {
                                        if (i == needed_i)
                                        {
                                            currentPUser = sock;
                                            currentWord  = words[r.Next(words.Count)];
                                        }
                                        i++;
                                    }
                                    lock (clients)
                                        add_new_client(1, ((Client)clients[currentPUser]).game_bill, ((Client)clients[currentPUser]).ip, ((Client)clients[currentPUser]).socket, currentPUser);
                                    sendTCP(currentPUser, "CommandType=3\r\n" + currentWord);
                                }
                                Update_list();
                            }
                        }
                        else
                        {
                            str = regexFunc(@"Text=\w+", Source);
                            if (str.Substring(5) == currentWord)
                            {
                                try
                                {
                                    add_new_client(0, ((Client)clients[currentPUser]).game_bill + 10, ((Client)clients[currentPUser]).ip, ((Client)clients[currentPUser]).socket, currentPUser);
                                }
                                catch { }
                                try
                                {
                                    add_new_client(0, ((Client)clients[client]).game_bill + 10, ((Client)clients[client]).ip, ((Client)clients[client]).socket, client);
                                    Update_list();
                                    sendTCP(currentPUser, "CommandType=3\r\n");
                                }
                                catch { }
                            }
                        }
                        str = null;
                    }
                    lock (command_risovalko_log)
                        command_risovalko_log.Add(client.ToString() + ": " + Source);
                    lock (clients)
                        foreach (IntPtr sock in clients.Keys)
                        {
                            sendTCP(sock, client.ToString() + ": " + Source);
                        }
                    GC.Collect();
                }
                else
                {
                    break;
                }
            }
            lock (clients)
                if (clients.ContainsKey(client))
                {
                    AddTextSafe("Клиент отключился: " + ((Client)clients[client]).ip);
                    clients.Remove(client);
                    WSA.Close_Socket(client);
                    if ((client == currentPUser) && (clients.Count > 0))
                    {
                        currentWord = "";
                        lock (command_risovalko_log)
                            command_risovalko_log = new List <string>();
                        lock (clients)
                        {
                            Random r        = new Random();
                            int    i        = 0;
                            int    needed_i = r.Next(clients.Count);
                            foreach (IntPtr sock in clients.Keys)
                            {
                                if (i == needed_i)
                                {
                                    currentPUser = sock;
                                    currentWord  = words[r.Next(words.Count)];
                                }
                                i++;
                            }
                            add_new_client(1, ((Client)clients[currentPUser]).game_bill, ((Client)clients[currentPUser]).ip, ((Client)clients[currentPUser]).socket, currentPUser);
                            sendTCP(currentPUser, "CommandType=3\r\n" + currentWord);
                            foreach (IntPtr sock in clients.Keys)
                            {
                                sendTCP(sock, currentPUser.ToString() + ": CommandType=0\r\nText=!start");
                            }
                        }
                        Update_list();
                    }
                    else if (client == currentPUser)
                    {
                        currentWord           = "";
                        command_risovalko_log = new List <string>();
                        GC.Collect();
                    }
                    Update_list();
                }
        }