На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Глючит TSocketClient или я?
    В общем при старте программа
    делает следующее

    ExpandedWrap disabled
      ServerConnection=0;
      ClientSocket->Open();
      while (ServerConnection==0) {
             Application->ProcessMessages();
      }


    Т.е. пытается соединиться с сервером.
    В OnConnect соответсвенно ServerConnection=1;
    В OnError ServerConnection=-1;
    Ну и в зависимости от ServerConnection на выходе из цикла мы соединяемся с базой в многопользовательском или монопольном режиме.
    Но почему-то на некоторых машинах (WinXP, Win98 не важно) вместо OnError (когда сервер не запущен) вызывается метод OnDisconnect в котором:

    Application->MessageBox("Соединение с сервером разорвано!","Ошибка!",MB_OK);
    Application->Terminate();

    И на этих машинах в монопольном режиме программа не запускается вообще.
    Почему вызывается OnDisconnect (а не OnError) если сервер не запущен и соединения нет в принципе.
    Может мне как-то переделать алгоритм?
    Мне нужно если удалось соединение - значит 1, если нет -1. Если разорвано, то выйти из проги.
    Сообщение отредактировано: Adalon -
      Adalon
      Событие OnError срабатывает только в шести случаях:

      eeGeneral The socket received an error message that does not fit into any of the following categories.
      eeSend An error occurred when trying to write to the socket connection.
      eeReceive An error occurred when trying to read from the socket connection.
      eeConnect A connection request that was already accepted could not be completed.
      eeDisconnect An error occurred when trying to close a connection.
      eeAccept A problem occurred when trying to accept a client connection request.

      Все остальные тебе нужно ловыить самому либо через Try...Except, либо можешь повесить процедуру на Application.OnException и обрабатывать коды ошибок: 10022, 10024, 10035..10065, 10067 (это всё что касается сети)
        Plumbum
        Хорошо.
        1. Как мне отловить именно разрывание соединения с сервером при закрытии оного или сетевом сбое?
        2. Как мне отловить невозможность соединения?
        Ведь после Open программа не ждет результата, а продолжает выполняться. Она может запуститься уже, а OnConnected вызваться чуть позже.

        Вот например если не соединился с сервером клиент то ErrorEvent: 3 /* Scktcomp::eeConnect */
        А ErrorCode=10061

        Но почему на другой машине вызывается OnDisconnect? Ведь соедиения не было, т.е. должен быть вызван только OnError.
          10022: Получен недопустимый аргумент.
          10024: Открыто слишком много сокетов.
          10035: Операция на незаблокированном сокете не может быть завершена немедленно.
          10036: Сейчас выполняется операция блокировки.
          10037: На незаблокированном сокете сделана попытка выполнить операцию при наличии другой выполняемой операции.
          10038: Сделана попытка выполнить операцию на объекте, не являющемся сокетом.
          10039: В операции на сокете пропущен обязательный адрес.
          10040: Сообщение, отправленное на сокет датаграмм, было больше, чем буфер внутренних сообщений или был превышен иной сетевой параметр. Также возможно, что буфер для принятия сообщения был меньше, чем размер сообщения.
          10041: Протокол, указанный в вызове функции сокета, не поддерживает такую семантику для требуемого типа сокета.
          10042: Для вызова getsockopt или setsockopt был указан неизвестный, недопустимый или неподдерживаемый параметр или уровень.
          10043: Требуемый протокол не настроен в данной системе, или не существует его реализации.
          10044: Поддержка указанного типа сокетов в этом семействе адресов отсутствует.
          10045: Предпринятая операция не поддерживается для выбранного типа объекта.
          10046: Данное семейство протоколов не настроено в системе, или оно не реализовано.
          10047: Адрес несовместим с выбранным протоколом.
          10048: Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт).
          10049: Требуемый адрес для своего контекста неверен.
          10050: Операция на сокете обнаружила отключение сети.
          10051: Сделана попытка выполнить операцию на сокете при отключенной сети.
          10052: Подключение было разорвано из-за ошибки во время выполнения операции.
          10053: Программа на вашем хост-компьютере разорвала установленное подключение.
          10054: Удаленный хост принудительно разорвал существующее подключение.
          10055: Невозможно выполнить операцию на сокете, т.к. буфер слишком мал или очередь переполнена.
          10056: Сделан запрос на подключение для уже подключенного сокета.
          10057: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied.
          10058: Запрос на отправку или получение данных был запрещен, т.к. сокет уже отключен в данном направлении на основании прежней запроса на его отключение.
          10059: Слишком много ссылок на некоторый ключевой объект.
          10060: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера.
          10061: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.
          10062: Не удается преобразовать имя.
          10063: Компонент имени или все имя слишком длинно.
          10064: Произошла ошибка операции на сокете, т.к. конечный хост выключен.
          10065: Сделана попытка выполнить операцию на сокете для недоступного хоста.
          10067: Реализация Windows Sockets может иметь ограничения на количество одновременно выполняющихся приложений.

          Разбей их по категориям (выбери касающиеся тебя) и через Case поймешь разорвано соединение или оно не установилось.

          Добавлено
          А зачем тебе при неустановившемся соединении получать -1, а при разрыве выходить из программы. Не проще ли написать процедуру которая ожидает соединение и возобнавляет если оно разорвалось?
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0242 ]   [ 16 queries used ]   [ Generated: 19.10.25, 16:58 GMT ]