| 
| 
 | Вопрос # 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 по умолчанию настраивается где то в реесте, и составляет очень большой промежуток времени. Если его уменьшить - это увеличит нагрузку на сеть. Причём может заметно увеличить. Проще эксперементировать с конкретным приложением.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |