#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 (включая маршрутизаторы) были установлены правильно.