Конференция "Сети" » Переподключится к другому телнет серверу [D7, WinXP]
 
  • Alex_C (12.03.09 10:18) [20]
    В общем интересная вещь получается: адрес определяется! Т.е. как бы все верно, но соединения не происходит. Мда. Вроде все просто, ан нет...
  • Сергей М. © (12.03.09 10:19) [21]
    А чему равен ?
  • Alex_C (12.03.09 10:47) [22]
    У меня получается 1244580 - я так понимаю это и есть представление адреса?
  • Сергей М. © (12.03.09 12:17) [23]

    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;

  • Alex_C (12.03.09 14:57) [24]
    То Сергей М. : Огромноге спасибо! В очередной раз Вы мне помогли!
    Правда так до конца не понятно, почему ж он как надо не работает - но по ходу тут надо самому писать свой ClientSocket - и тут уже разбираться!
    Еще раз спасибо!
  • Сергей М. © (12.03.09 15:31) [25]

    > не понятно, почему ж он как надо не работает


    Похоже на баг - LookupState после отказа с кодом 11001 не возвращается в состояние lsIdle.

    Можно было бы  сделать это и вручную прямо в обработчике OnError, но св-во это - read only
  • Сергей М. © (12.03.09 15:47) [26]
    Можно поступить и так - непосредственно перед очередной попыткой коннекта к какому либо хосту читать св-во ClientSocket.Socket.LookupState, и если оно не равно lsIdle, то разрушить компонент и тут же создать его вновь.
  • _0 (12.03.09 18:43) [27]
    asConnect убери из ClientSocket.Socket.AsyncStyles
  • Сергей М. © (12.03.09 19:40) [28]

    > _0   (12.03.09 18:43) [27]


    Ахинея.
  • FireMan_Alexey © (12.03.09 20:01) [29]
    Есть очень старый(в смысле давно писал) переписанный КлиентСокет, могу кинуть :)
 
Конференция "Сети" » Переподключится к другому телнет серверу [D7, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.004]