Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переподключится к другому телнет серверу [D7, WinXP]


Страницы:   1 2

Alex_C ©   (2009-03-10 20:20:00) 

Проблема: получаю данные по телнет протоколу из инета:
Сделал:

 TelnetSocket: TClientSocket;

...
procedure TTelnetForm.ClientOnError(Sender: TObject; Socket: TCustomWinSocket;
 ErrorEvent: TErrorEvent; var ErrorCode: integer);
var
 ErrStr: string;
begin
 case ErrorEvent of
   eeGeneral: ErrStr := 'General Error';
   eeSend: ErrStr    := 'Send Error';
   eeReceive: ErrStr := 'Receive Error';
   eeConnect: ErrStr := 'Connect Error';
   eeDisconnect: ErrStr := 'Disconnect Error';
   eeAccept: ErrStr  := 'Accept Error';
   eeLookup: ErrStr  := 'Lookup Error';
 end;

 SetLength(TelnetText, Length(TelnetText) +  1);
 TelnetText[Length(TelnetText)-1] := 'Error Type : ' + ErrStr +
   ', Error Code : ' + IntToStr(ErrorCode);
 ErrorCode := 0;
 TelnetSocket.Close;
 // Подключаемся к следущему в списке серверов при ошибке
 FindNextTelnetServer;
end;

...

procedure TTelnetForm.FindNextTelnetServer;
begin
// Пока не пончится таблица адресов - перебираем адреса
 if (not TelnetTable.Eof) and (TelnetTable.FindNext) then
 begin
   TelnetSocket.Host   := TelnetTableAddress.AsString;
   TelnetSocket.Port   := TelnetTablePort.Value;
   TelnetSocket.Active := True;
 end
 else
 begin
   SetLength(TelnetText, Length(TelnetText) +  1);
   TelnetText[Length(TelnetText)-1] := 'Can not find working server!';
   CopyTelnetStrToTelnetWindows;

   if TelnetSocket.Active then
     TelnetSocket.Close;
 end;
end;


Проблема заключается в том, что если первый сервер в списке недоступен, он и к остальным поключится не может.
Пишет
Error Type : Connect Error, Error Code : 10049


Сергей М.   (2009-03-11 13:00:00) [21]


> <здесь в каждой кнопке пишу адрес сервера>


Может все же не адрес сервера, а имя хоста?


Alex_C   (2009-03-11 12:52:00) [22]

То Сергей М. Для проверки набиваю любой несуществующий адрес.
От правильно ругается - Lookup error - он его не находит.
Так вот если сразу после этого, хоть в ручную, по нажантю на кнопку, хоть при вызове PostMessage из ф-ции ClientOnError при соединении с существующим адресом 1-й раз он напишет 10049 ошибку, второй раз - соединиться.
Для проверки делал очень просто:
создал для пробы 3 кнопки с такого вида кодом


  if TelnetSocket.Active then
    TelnetSocket.Socket.Close;
  TelnetSocket.Host   := <здесь в каждой кнопке пишу адрес сервера>;
  TelnetSocket.Port   := 23;
  TelnetSocket.Active := True;


Первая - с несуществующим адресом, 2 другие - с существующим.
Если нажимаю на существующий адрес - соединение есть. Не существующий - Lookup error, опять существующий - ошибка 10049, снова нажимаю эту же кнопку - соединение есть! Т.е. такое впечатление что при неудачной попытке ошибка не сбрасывается, а сбрасывается только при обращении к существующему адресу.


Сергей М.   (2009-03-11 10:57:00) [23]


> даже если это один и тот же сервер


Это как ?

Давай уже приводи список в том виде, в котором данные из него при каждой итерации попадают в св-ва Host и Port компонента непосредственно перед тем как он переводится тобой в состояние Active=True ..


Сергей М.   (2009-03-11 10:54:00) [24]


> к нерабочему адресу


> выдает Lookup Error (что верно)


Да вот как раз и не верно.
Lookup Error - ошибка, возникающая не при недоступности хоста, а при невозможности разрешить имя хоста в его адрес.

А под "нерабочим адресом", насколько я понял, ты подразумеваешь IP-адрес хоста, недоступного по каким-то причинам на момент обращения к нему.


Alex_C   (2009-03-11 10:43:00) [25]

Сейчас попробовал:
а если сделать так:
не работающий сервер
работающий
работающий

то первый работающий сервер выдает ошибку 10049, а второй подсоединяется нормально, даже если это один и тот же сервер.


Alex_C   (2009-03-11 10:10:00) [26]

Да, а вот ставишь первым работающий сервер - прекрасно соединяется.
Причем что заметил:
для проверки делаешь список адресов серверов:
не работающий
работающий
не работающий
и т.д.
При обращении к нерабочему адресу как положено несколько секунд его опрашивает, потом выдает Lookup Error (что верно), а при обращении к точно рабочему - прям сразу выкидывает 10049, и т.д.


Сергей М.   (2009-03-11 09:43:00) [27]

Т.е. всепопытки подключения приводят к отказу с кодом 10049 ?


Alex_C   (2009-03-11 09:40:00) [28]

Спасибо за совет. Заменил на SocetClose.
Заменил в ClientOnError прямой вызов FindNextTelnetServer
на PostMessage, с последущим вызовом в обработке этого сообщения FindNextTelnetServer. Однако ничего не изменилось...


Сергей М.   (2009-03-11 08:33:00) [29]

1. Замени

TelnetSocket.Close;

на

Socket.Close;

2. Убери из обработчика OnError непосредственный вызов FindNextTelnetServer
Вместо этого посылай окну формы любое предопределенное асинхронноесообщение, в обработчике которого собссно и вызывай FindNextTelnetServer


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо