Исключение сокета C# "существующее соединение было принудительно закрыто удаленным хостом"
Я пытаюсь написать небольшой серверный клиентский код, в котором клиент отправляет управляющее сообщение серверу для выполнения задания.
Поток программы идет как таковой
1. клиент отправляет управляющее сообщение и переходит в режим ожидания до получения ответного сообщения.
2. сервер получает сообщение и отправляет клиенту сообщение об успешном/неудачном выполнении, а busy ждет, пока не будет получено сообщение о завершении работы(т. е. нулевой байт).
3. клиент получает сообщение "success/failure" и отправляет сообщение close socket (zero byte shutdown.send) на сервер и переходит в режим занятого ожидания, пока не получит сообщение shutdown.
4. сервер получает сообщения о завершении работы, отправляет ответное завершение работы и освобождает ресурсы сокета.
5. клиент получает завершение работы и освобождает ресурсы сокета.
Что я уже пробовал:
этот код выглядит следующим образом
сторона клиента
try { sock = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); sock.Connect(remoteEP); string sent_msg = "RESTART CCMCOM"; MessageLogTextBox.AppendText("Message sent at " + DateTime.Now + " : " + sent_msg + Environment.NewLine); byte[] msg = Encoding.ASCII.GetBytes(sent_msg); sock.Send(msg); Thread.Sleep(500); msg = new byte[1024]; sock.Receive(msg); string received_msg = Encoding.ASCII.GetString(msg).Trim(); MessageLogTextBox.AppendText("Message received at " + DateTime.Now + " : " + received_msg + Environment.NewLine); MessageLogTextBox.AppendText(Environment.NewLine); MessageLogTextBox.AppendText(Environment.NewLine); sock.Shutdown(SocketShutdown.Send); while (sock.Receive(msg) != 0) ; sock.Disconnect(false); sock.Close(); } catch (Exception ex) { MessageLogTextBox.AppendText(ex.Message); }
сторона сервера
try { listener.Bind(localEndPoint); listener.Listen(10); outputFile.WriteLine("DCA1_CCMCOM_Remote_Restart_Service started at : {0}", DateTime.Now); // Start listening for connections. while (true) { //Thread is suspended while waiting for an incoming connection. handler = listener.Accept(); string data = null; // An incoming connection is processed. bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); if (bytesRec != 0) { data = Encoding.ASCII.GetString(bytes, 0, bytesRec); if (data.IndexOf("RESTART CCMCOM") > -1) { //search the desired service ServiceController sc = new ServiceController("DCA1_CCMCOM"); //if the service is running, stop it if (sc != null && sc.Status.Equals(ServiceControllerStatus.Running)) sc.Stop(); Thread.Sleep(10); sc.Refresh(); //busy wait till it is stopped while (sc != null && !sc.Status.Equals(ServiceControllerStatus.Stopped)) sc.Refresh(); sc.Start(); outputFile.WriteLine("Service restarted at : {0}", DateTime.Now); handler.Send(Encoding.ASCII.GetBytes("Service Restarted")); //Expecting a close request from client end, busy wait till a zero byte (i.e. close) request is received while ( handler.Receive(bytes) != 0) ; //after receiving the close request, send a return shutdown request to client handler.Shutdown(SocketShutdown.Send); handler.Disconnect(true); handler.Close(); } } else { handler.Shutdown(SocketShutdown.Send); handler.Disconnect(true); handler.Close(); } } } catch (Exception e) { outputFile.WriteLine("DCA1_CCMCOM_Remote_Restart_Service stopped at : {0} due to {1}", DateTime.Now, e.Message); handler.Shutdown(SocketShutdown.Both); handler.Disconnect(true); handler.Close(); }
где я ошибаюсь?