некоректо работает Socket сервер

114
10 января 2021, 02:00

есть классы 1) Объект состояния сокет-клиента StateObject и 2) сам сервер SocketAsync

если запустить клиент и отправить сообщение один раз все ок, но на второй раз прога зависает и вылетает (без ошибок). В чем может быть такое поведение? Такое чувство что кто-то обрывает соединение.

если клиент отправляет сообщение, сокет считывает его, записывает все в консоль и отправляет ответ клиенту, после чего, как я понял, он разрывает соединение с клиентом (но не нахожу где именно это происходит)

public class StateObject
{
    // сокет-клиент 
    public Socket workSocket = null;
    // размер буфера.  
    public const int BufferSize = 1024;
    // буфер для получателя
    public byte[] buffer = new byte[BufferSize];
    // полученная информация 
    public StringBuilder sb = new StringBuilder();
}

public class SocketAsync
{
    public static ManualResetEvent allDone = new ManualResetEvent(false);
    public SocketAsync() { }
    public static void StartListening()
    {
        IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8005);
        // Создаю сокет  
        Socket listener = new Socket(ipAddress.AddressFamily,SocketType.Stream, ProtocolType.Tcp);
        // привязываю socket к локальному endpoint и слушаю  
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(100);
            while (true)
            {
                // Устанавливаю в выключенное состояние 
                allDone.Reset();
                // НАчинаю ассинхронное прослоушивание 
                Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    listener);
                // ожидаю подключение
                allDone.WaitOne();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        Console.WriteLine("\nPress ENTER to continue...");
        Console.Read();
    }
    public static void AcceptCallback(IAsyncResult ar)
    {
        // даю сигнал главному потоку для продолжения работы
        allDone.Set();
        // получаю сокет, который обрабатывает запрос клиента
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);
        // создаю объект состояния 
        StateObject state = new StateObject();
        state.workSocket = handler;
        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);
    }
    public static void ReadCallback(IAsyncResult ar)
    {
        String content = String.Empty;
        //Получаю состояние и сокет-обработчик 
        StateObject state = (StateObject)ar.AsyncState;
        Socket handler = state.workSocket;
        // Считываю данные из  сокета-клиента 
        int bytesRead = handler.EndReceive(ar);
        if (bytesRead > 0)
        {
            // сохраняю полученные данные.  
            state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
            // проверяю всю ли инфу я считал 
            content = state.sb.ToString();
            //if (content.IndexOf("<EOF>") > -1)
            if (content.Length > 0)
            {
                // записую на сервере
                Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
                    content.Length, content);
                // шлю клиенту
                Send(handler, content);
            }
            else
            {
                // если считано не все  
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
            }
        }
    }
    private static void Send(Socket handler, String data)
    {
        byte[] byteData = Encoding.ASCII.GetBytes(data);
        // передаю
        handler.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), handler);
    }
    private static void SendCallback(IAsyncResult ar)
    {
        try
        {
            // получаю сокет из объекта состояния.  
            Socket handler = (Socket)ar.AsyncState;
            // завершаю передачу данных на удаленное устройство 
            int bytesSent = handler.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to client.", bytesSent);
            //handler.Shutdown(SocketShutdown.Both);
            //handler.Close();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
}
READ ALSO
Получение коллекций из базы данных SQL [закрыт]

Получение коллекций из базы данных SQL [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

117
Как заполнить radiobutton массивом C# Windows Form

Как заполнить radiobutton массивом C# Windows Form

Есть несколько radioButton пример, (заполнены для примера, нужно случайными через цикл)

101
C# Когда оправдан захват внешних переменных в анонимных методах?

C# Когда оправдан захват внешних переменных в анонимных методах?

В C# предусмотрен механизм захвата внешних переменных в анонимных методахПриведу пример кода:

129
Окрасить ячейки datagrid wpf

Окрасить ячейки datagrid wpf

имеется вот такая таблица Datagrid

136