|
Вопрос # 1 845/ вопрос открыт / |
|
Здравствуйте уважаемые эксперты!
Такой вопрос. Есть трехзвенная система. Если протадает сеть возникает ошибка Windows Socket error. Как лечить.
Необходимо, что бы клиент работал без явного подключения, пока не востановится сеть.
 |
Вопрос задал: John (статус: Посетитель)
Вопрос отправлен: 26 августа 2008, 13:26
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, John-1434!
Ошибка Windows Socket error возникает не в момент пропадания сети, а в тот момент, когда клиент пытается читать/писать с/в сеть и умирает по таймауту. Или если включено KeepAlive (в этом случае операционная система сама "ганяет пакеты" и может генерировать исключение.
К сожалению, я не знаю, какими компонентами/библиотеками вы пользуетесь, но в целом решение есть. просто использовать обработку исключительных ситуаций (Try-exept) - все(или почти все) вызовы чтения/записи заключить в них и в случае обнаружения выставлять флажок "офлайн". Потом время от времени (например по таймеру) пытаться восстановить подключение.
Если же вы проектируете только приложение(то есть есть ещё время доделать/переделать) и приложение будет работать в локальной сети, то можно попробовать использовать UDP. В это случае не нужны подтверждения пакетов и если сеть разорвалась, то это можно узнать только по тому, что от клиента ничего не пришло.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 августа 2008, 14:04
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 26 августа 2008, 23:28; участников в обсуждении: 3.
|
John (статус: Посетитель), 26 августа 2008, 14:16 [#1]:
Как можно изменить таймер. Слишком долго.
Я обрабатываю Try Except.
Все работает, только долго.
Необходимо, чтобы прога быстрей реагировала.
Подскажите пож-ста.
|
|
John (статус: Посетитель), 26 августа 2008, 14:32 [#2]:
В реестре ключ стоит = TRUE
Если убрать. Прога будет делать исключения?
|
|
Feniks (статус: Бакалавр), 26 августа 2008, 16:28 [#3]:
Какой еще реестр ??? Вы о чем ?
Блок try ... except ... end ни от какого реестра не завасит. Он обрабатывает исключительные ситуация в работе вашего приложения, которые могут вызвать сбой/крах всей программы.
Все что находится между try ... except пока не возникнут ошибки, после чего работа прерывается и управление передается в блок except ... end. Это делается специально, что бы программист мог обработать такие ошибки и не позволил вывалиться приложению со сбоем и крахом.
|
|
Вадим К (статус: Академик), 26 августа 2008, 23:28 [#4]:
Цитата:
Необходимо, чтобы прога быстрей реагировала. .
Я написал, программа может узнать тогда, когда пытается отправить/принять данные. В многих системах делают так называемый KeepAlive пакет (дословно с английского - сохраняющий состояние жизни). Эти пакеты представляют собой маленькую последовательность байт, и работает это так. Через какое то время клиент обьязан послать серверу такой пакет, а сервер ответить либо таким же, либо своим, специальным. Если клиент ведёт активный обмен в данный момент с сервером, то отсылать KeepAlive пакеты не обязан. Часто такое програмное решение называют на жаргоне "пинг-понгом".
Соответсвенно, если надо сделать реакцию более быстрой, уменьшаете время простоя между отсылкой пакета. Также не забывайте, что прийдётся приплюсовать сюда время таймаута на ожидание пакета. И если сервер у Вас на другом конце света, линии связи плохие, таймаут выставлен в доли секунды, то соединение будет рваться постоянно.
Значение KeepAlive по умолчанию настраивается где то в реесте, и составляет очень большой промежуток времени. Если его уменьшить - это увеличит нагрузку на сеть. Причём может заметно увеличить. Проще эксперементировать с конкретным приложением.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|