![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переподключится к другому телнет серверу [D7, WinXP]
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