Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Отловить FD_CLOSE при блокирующем режиме сокета


Автор: ztlsk 18.9.2015, 09:18
Есть связка программ клиент-сервер, все они используют блокирующий режим работы сокетов (обработка в главном потоке, ожидания в отдельных). Пока дело касалось работы в пределах одной локальной сети вопросов не возникало. Но с размещением клиентов на удаленные машины в интернете стали сыпаться ошибки 10053, 10054 всякий раз при попытке сервера послать запрос после паузы в несколько часов. В программах не существовало никаких механизмов типа Keep-Alive. 

Для эксперимента на клиенте активировал опцию сокета KEEPALIVE, выставил свои параметры (начинать отсыл не через 2 стандартных часа после последнего сеанса связи, а через 10 секунд), проверил сниффером - работает, приходит 1 байт примерно раз в 10сек. 
Следующим шагом хотел бы получать в главный поток программы сообщение FD_CLOSE при обнаружении модулем TCP разрыва соединения, но функция настройки таких оповещений WSAAsyncSelect автоматически переводит сокет в неблокирующий режим и программа в прежнем виде уже, естественно, не работает. Как поступить в такой ситуации? Можно ли не переводя программу на неблокирующие сокеты получать сообщения об обнаружении обрыва связи?

Автор: leniviy 19.9.2015, 17:22
Нужно, чтобы какой-нибудь тред постоянно читал из сокета. Тогда ему при обрыве сразу вернёт ошибку.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Otlovit-FD_CLOSE-pri-blokiruyushchem-rezhime-soketa-id55fbad4fae201556468b4567#findElement_E7045_55fd6f88ae20152c6e7f5ed2_0

Автор: ztlsk 2.10.2015, 12:55
Цитата(leniviy @ 19.9.2015,  17:22)
Нужно, чтобы какой-нибудь тред постоянно читал из сокета. Тогда ему при обрыве сразу вернёт ошибку.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Otlovit-FD_CLOSE-pri-blokiruyushchem-rezhime-soketa-id55fbad4fae201556468b4567#findElement_E7045_55fd6f88ae20152c6e7f5ed2_0

Так в том и дело, что хочу использовать уже готовый заложенный механизм keep-alive, самостоятельную отсылку по таймеру каждые 5 минут я делал, это же не спортивно что ли. Только вот не нашел как сделать чтобы при блокирующих сокетах сообщения от keep-alive получать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)