Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 845

/ вопрос открыт /

Здравствуйте уважаемые эксперты!
Такой вопрос. Есть трехзвенная система. Если протадает сеть возникает ошибка Windows Socket error. Как лечить.
Необходимо, что бы клиент работал без явного подключения, пока не востановится сеть.

John Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

John (статус: Посетитель), 26 августа 2008, 14:16 [#1]:

Как можно изменить таймер. Слишком долго.
Я обрабатываю Try Except.
Все работает, только долго.
Необходимо, чтобы прога быстрей реагировала.
Подскажите пож-ста.
John

John (статус: Посетитель), 26 августа 2008, 14:32 [#2]:

В реестре ключ стоит = TRUE
Если убрать. Прога будет делать исключения?
Feniks

Feniks (статус: Бакалавр), 26 августа 2008, 16:28 [#3]:

Какой еще реестр ??? Вы о чем ?
Блок try ... except ... end ни от какого реестра не завасит. Он обрабатывает исключительные ситуация в работе вашего приложения, которые могут вызвать сбой/крах всей программы.
Все что находится между try ... except пока не возникнут ошибки, после чего работа прерывается и управление передается в блок except ... end. Это делается специально, что бы программист мог обработать такие ошибки и не позволил вывалиться приложению со сбоем и крахом.
Вадим К

Вадим К (статус: Академик), 26 августа 2008, 23:28 [#4]:

Цитата:

Необходимо, чтобы прога быстрей реагировала.
.
Я написал, программа может узнать тогда, когда пытается отправить/принять данные. В многих системах делают так называемый KeepAlive пакет (дословно с английского - сохраняющий состояние жизни). Эти пакеты представляют собой маленькую последовательность байт, и работает это так. Через какое то время клиент обьязан послать серверу такой пакет, а сервер ответить либо таким же, либо своим, специальным. Если клиент ведёт активный обмен в данный момент с сервером, то отсылать KeepAlive пакеты не обязан. Часто такое програмное решение называют на жаргоне "пинг-понгом".
Соответсвенно, если надо сделать реакцию более быстрой, уменьшаете время простоя между отсылкой пакета. Также не забывайте, что прийдётся приплюсовать сюда время таймаута на ожидание пакета. И если сервер у Вас на другом конце света, линии связи плохие, таймаут выставлен в доли секунды, то соединение будет рваться постоянно.

Значение KeepAlive по умолчанию настраивается где то в реесте, и составляет очень большой промежуток времени. Если его уменьшить - это увеличит нагрузку на сеть. Причём может заметно увеличить. Проще эксперементировать с конкретным приложением.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.