Заметил что не отрабатывается таймаут на подключение должным образом, и почему то всегда равен около 21 сек., хотя в параметрах подключения установлен как 60 сек. или 30 сек., в следствии чего некоторые объекты не опрашиваются по ошибке таймаута подключения.
Для этого даже подключил монитор пакетов на интерфейс, что бы удостовериться что ответ все таки приходит с задержкой более 21 сек.
Не совсем понятно где вы увидели ошибку?
- Тайм-аут на подключение, это время в течении которого ЛЭРС УЧЕТ ожидает установки подключения. Вы говорите что у вас установлено 60 секунд, на первом скриншоте в 7 строке Журнала опроса четко видно, что тайм-аут на подключение 60 секунд. В чем заключается ошибка?
- Вы говорите, что ответ приходит на 27 секунде после отправки 1-го пакета. Удаленный узел отверг подключение. Не совсем понятно, как это должно быть связанно с тайм-аутом?
Покажите журнал опроса целиком.
Поясню:
Имеем GPRS терминал, работающий в “прозрачном режиме” в режиме “Сервер”, т.е. терминал слушает порт 5050 на попытки входящих подключений, сервер ЛЭРС учет, в нашем случае это “Клиент”, т.к. сервер пытается подключиться к терминалу на порту 5050.
Клиент (сервер ЛЭРС) пытается подключиться к серверу (терминалу) при этом отправляет пакет с номером последовательности и флагом SYN (что мы видим на втором скриншоте в первой строке, поле “Info”, возьмем это за точку отсчета первую строку из журнала ЛЭРС - 14:42:40 и 0 сек. (поле Time) из монитора пакетов.
Т.к. клиент не получает ответа от сервера, пакет посылается повторно на 3 и 9 сек. после начала опроса, это мы видим на втором скриншоте 2 и 3 строка соответственно.
Из журнала подключения ЛЭРС мы видим что в 14:43:01 “Задание остановлено.” по причине
“Ошибка опроса. Ошибка подключения к 10.100.98.52:5050. , т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера 10.100.98.52:5050 [10060]”
т.е. длительность опроса 14:42:40 - 14:43:01 = 21 сек., за это время как видно из монитора пакетов, ответа от сервера (терминала) не поступало т.е. соединение даже не было установлено, и никакие неверных откликов уж точно не было :-): . Проще говоря соединение было разорвано из-за:
“Попытка установить соединение была безуспешной.”
Тут возникает вопрос почему через 21 сек. после начала опроса, а не через положенных 60 сек?
Идем дальше…
Монитор пакетов у нас запущен, и из него мы видим (в 6 строке) на 27 секунде, с начала попытки установки соединения, клиенту (серверу ЛЭРС) поступил пакет от сервера (терминала) с флагами “SYN” и “ACK” т.е. сервер (терминал) перешел в в состояние SYN-RECEIVED, это состояние означает что - сервер получил запрос на соединение от клиента (сервера ЛЭРС), отправил ответный запрос и ожидает подтверждения от клиента (сервера ЛЭРС), но а в нашем случае клиент (сервер ЛЭРС) уже 6 сек. как не ожидает подключения.
Приложил, но думаю после описанного выше он уже не нужен.
Журнал опроса 144301.xls (13 KB)
Истекает не наш таймаут, а внутренний таймаут Windows. По умолчанию, при попытке установить связь с удалённой стороной Windows отправляет 3 SYN-пакета с таймаутами увеличивающимися от 3 до 12 секунд. Общий таймаут получается в районе 21 секунды, именно это вы и наблюдаете. После того как истёк таймаут в 21 секунду, Windows прекращает попытки установить связь и возвращает нам ошибку подключения 10060. Сообщение “Попытка установить соединение была безуспешной…” это стандартное описание такой ошибки, его протоколирует не ЛЭРС УЧЁТ.
Мы можем только уменьшить системный таймаут, прервав ожидание раньше, но не увеличить. Поэтому значения выше 21 в случае TCP-подключений не имеют практического смысла.
Теоретически увеличить этот таймаут можно, задав конфигурацию для всей сетевой подсистемы .NET приложений. В этой статье описано как это сделать:
http://stackoverflow.com/questions/22341885/increase-timeout-for-system-net-sockets-socket-connect
С помощью команды PowerShell можно увеличить количество SYN-пакетов со значения по умолчанию до значения, которое вас устроит. Стоит иметь в виду, что эта настройка повлияет не только на ЛЭРС УЧЁТ, а на все программы, использующие .NET.
Например, эта POWERSHELL команда увеличит таймаут ожидания примерно до 90 секунд.
Set-NetTCPSetting -SettingName InternetCustom -MaxSynRetransmissions 4