сетевой поток c #.Ошибка чтения Не удается прочитать данные из транспортного соединения

#c# #sockets #networkstream

#c# #сокеты #networkstream

Вопрос:

Я создаю сервер сокетов на c #. Клиент отправляет пакет ping раз в секунду. Затем сервер периодически доставляет пакеты ping клиенту. Когда к серверу подключено около 20 устройств, через короткий промежуток времени возникает следующая ошибка.

System.IO.IOException: Не удается прочитать данные из транспортного соединения: A

попытка подключения не удалась, поскольку подключенная сторона не ответила должным образом

по истечении определенного периода времени или сбой установленного соединения из-за подключенного хоста

не удалось ответить. —> System.Net.Sockets.Исключение SocketException: соединение

попытка не удалась, поскольку подключенная сторона не ответила должным образом после

период времени или сбой установленного соединения, поскольку подключенный хост имеет

не удалось ответить

в System.Net.Sockets.NetworkStream.Read(буфер байт[], смещение Int32, размер Int32)

— Завершение трассировки стека внутренних исключений —

в System.Net.Sockets.NetworkStream.Read(буфер байт[], смещение Int32, размер Int32)

в System.IO.StreamReader.ReadBuffer()

в System.IO.StreamReader.ReadLine()

Когда возникает эта ошибка, она возникает одновременно почти для всех подключенных клиентских сокетов. Время получения и время отправки серверного сокета были изменены с 3 секунд на 10 секунд.Но ошибка возникает таким же образом.

Я искал решение этой проблемы более трех дней.

Он разрабатывается через asp.net и распространяется через iis.

 void ReceiveRunnable()        
{

            log.Debug($"Start 'Receive Runnable'");
            try
            {

                int exceptionCount = 0;

                string line;

                while (IsRun)
                {
                    try
                    {
                        while (socket != null amp;amp; (line = reader.ReadLine()) != null)
                        {
                            exceptionCount = 0;

                            if (!string.IsNullOrWhiteSpace(line))
                            {
                                // Ping Packet
                                if (line[0] == '0')
                                {
                                    ReceivePingPacket(line);
                                }
                                else
                                {
                                    buffer.Enqueue(line);
                                }
                            }
                        }
                    }
                    catch (SocketException e)
                    {
                        log.Error(e   "   e:"   e.SocketErrorCode);
                        break;
                    }
                    catch (IOException e)
                    {
                        if (IsRun)
                        {
                            log.Error(e);
                            break;
                            Thread.Sleep(100);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                if (IsRun)
                {
                    log.Error(e);
                }
            }
            finally
            {
                Close();
                OnDisconnect?.Invoke(this);
            }
            log.Debug($"Stop 'Receive Runnable'");
        }
  

Комментарии:

1. Сначала сетевая карта отвечает на сообщения PING, а ваш серверный код ничего не делает. ПИНГ на клиентах не работает. Сообщение PING имеет тайм-аут, и кажется, что время ожидания всех устройств истекает одновременно, потому что они никогда не получают никаких ответов. Начните с простого, открыв cmd.exe и проверьте, действительно ли работает PING. Попробуйте использовать имя КОМПЬЮТЕРА и IP-адрес, чтобы увидеть, какой из них работает, а какой нет. Вероятно, имя компьютера рабочее, а IP-адрес не работает. Затем попробуйте выполнить пинг с сервера на клиент. PING может работать в одном направлении, а не в другом.

2. Могу ли я пропинговать его и проверить на отключение от сети? Поскольку подключено много устройств, пинговать cmd сложно. Итак, если вы создаете новый сервер, клиент и два разных сервера, и одновременно возникает одна и та же проблема, является ли это сетевой проблемой?

3. Проверка связи проверяет устройства, а не программное обеспечение сервера. Каждое устройство, встроенное в аппаратное обеспечение Ethernet, отвечает на сообщение PING. Вам не нужно устанавливать или запускать какое-либо программное обеспечение. Создание сервера ничего не дает. Ваше программное обеспечение — это клиентское программное обеспечение, которое отправляет запрос на аппаратное устройство и получает ответ. Когда вы выполняете пинг, не получаете ответа, это означает, что устройство не существует, и вы достигнете улова, когда истечет время ожидания.

4. понятно. Я проверю это и сообщу вам результаты. Что делать, если проблем с пингом нет или есть проблема? Если есть проблема с ping, является ли маршрутизатор недостаточной производительностью?

5. ПИНГ с использованием имени компьютера должен сработать. Для пинга с использованием IP требуется, чтобы маски на интерфейсах Ethernet (включая маршрутизаторы) были установлены правильно.