| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Так в том и дело, что хочу использовать уже готовый заложенный механизм keep-alive, самостоятельную отсылку по таймеру каждые 5 минут я делал, это же не спортивно что ли. Только вот не нашел как сделать чтобы при блокирующих сокетах сообщения от keep-alive получать. |