-
В общем интересная вещь получается: адрес определяется! Т.е. как бы все верно, но соединения не происходит. Мда. Вроде все просто, ан нет...
-
А чему равен ?
-
У меня получается 1244580 - я так понимаю это и есть представление адреса?
-
type
TConnectState = (csNone, csSuccess, csFail, csNeedReconnect);
var
ConnectState: TConnectState;
ErrCode: Integer;
procedure TForm1.Button3Click(Sender: TObject);
var
sl: TStrings;
i: Integer;
NextHost, NextService: String;
begin
sl := TStringList.Create;
try
sl.Add('first_notexistinghostname:telnet'); sl.Add('rambler.ru:telnet'); sl.Add('rn6bn.73.ru:telnet'); sl.Add('second_notexistinghostname:telnet'); sl.Add('rn6bn.73.ru:telnet'); i := 0;
while i < sl.Count do begin
ConnectState := csNone;
NextHost := Copy(sl[i], 1, Pos(':', sl[i])-1);
NextService := Copy(sl[i], Pos(':', sl[i])+1, Length(sl[i]));
ClientSocket.Host := NextHost;
ClientSocket.Service := NextService;
Memo.Lines.Add('--- ' + IntToStr(i) + '. Попытка коннекта к ' + sl[i] + ' ...');
ClientSocket.Active := True;
while ConnectState = csNone do begin
Application.ProcessMessages;
Sleep(0);
end;
case ConnectState of
csSuccess:
begin
Memo.Lines.Add('Успешное подключение к ' + sl[i]);
ClientSocket.Active := False;
Inc(i);
end;
csFail:
begin
Memo.Lines.Add('Отказ при подключении к ' + sl[i] + ', код отказа: ' + IntToStr(ErrCode));
Inc(i);
end;
csNeedReconnect:
begin
Memo.Lines.Add('Отказ при подключении к ' + sl[i] + ', код отказа: ' + IntToStr(ErrCode) + ', требуется повторная попытка');
end;
end;
end;
finally
sl.Free;
end;
end;
procedure TForm1.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
ConnectState := csFail;
ErrCode := ErrorCode;
if (ErrorEvent = eeConnect) and (ErrorCode = WSAEADDRNOTAVAIL) then
begin
ConnectState := csNeedReconnect;
end;
ErrorCode := 0;
Socket.Close;
end;
procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
ConnectState := csSuccess;
end;
-
То Сергей М. : Огромноге спасибо! В очередной раз Вы мне помогли! Правда так до конца не понятно, почему ж он как надо не работает - но по ходу тут надо самому писать свой ClientSocket - и тут уже разбираться! Еще раз спасибо!
-
> не понятно, почему ж он как надо не работает
Похоже на баг - LookupState после отказа с кодом 11001 не возвращается в состояние lsIdle.
Можно было бы сделать это и вручную прямо в обработчике OnError, но св-во это - read only
-
Можно поступить и так - непосредственно перед очередной попыткой коннекта к какому либо хосту читать св-во ClientSocket.Socket.LookupState, и если оно не равно lsIdle, то разрушить компонент и тут же создать его вновь.
-
asConnect убери из ClientSocket.Socket.AsyncStyles
-
> _0 (12.03.09 18:43) [27]
Ахинея.
-
Есть очень старый(в смысле давно писал) переписанный КлиентСокет, могу кинуть :)
|