abhitechno Ответов: 0

Исключение сокета 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();
            }


где я ошибаюсь?

0 Ответов