timeout в idhttp при конекте через сокс прокси (ЯП: Делфи)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by bertys, 9 Nov 2012.

  1. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте, подскажите пожалуйста что я делаю не так.

    Я посылаю гет запрос на сайт через idhttp и через сокс прокси, если прокси не рабочий, то оно конектится 20 сек и потом выдает ошибку, как сделать чтоб конект шел к примеру 5 сек.

    Я пробувал по разному, Но у меня не выходит (всеравно долго конектится):

    PHP:
    timeout:=5000;
    shost:='111.111.111.111';
    sport:=1080;

    idhttp1.ConnectTimeout:=timeout;  
    idhttp1.ReadTimeout:=timeout;
    IdIOHandlerStack1.ConnectTimeout:=timeout;
    IdIOHandlerStack1.ReadTimeout:=timeout;

    idsocksinfo1.Host:=shost;
    idsocksinfo1.Port:=sport;
    idsocksinfo1.Version:=svSocks4;

    IdIOHandlerStack1.TransparentProxy:=idsocksinfo1;
    idhttp1.IOHandler:=IdIOHandlerStack1;

    try
      
    http.Get('http://sait.ru');
     
    except
      showmessage
    ('Error');
     
    end;

    Очень нужно!!!

    Зарание спасибо
     
    #1 bertys, 9 Nov 2012
    Last edited: 9 Nov 2012
  2. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    265
    Likes Received:
    639
    Reputations:
    476
    Попробуй создавать поток и выполнять http.Get в нем. Если ответа не поступило за 5 секунд, то закрывай поток...
     
    _________________________
  3. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    как в дополнительном модуле объявлять поток? как его создать(запустить)? И как правельно булет его убить?
     
  4. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    примерно так:
    Code:
    function getThread(lpParameters: Pointer): DWORD; stdcall;
    begin
      ........
      // тут код запроса
      ........
      // если все удачно, то возвращаем STATUS_SUCCESS
      Result:= STATUS_SUCCESS;
      ........
      ExitThread(Result);
    end;
    
    procedure sendGet(timeout: Integer);
    var
      lpExitCode: DWORD;
      hThread: THandle;
    begin
      hThread:= CreateThread(nil, 0, @getThread, nil, 0, PDWORD(nil)^);
      if (hThread <> 0) then try
        
        case WaitForSingleObject(hThread, timeout) of
          
          WAIT_OBJECT_0:
            begin
              GetExitCodeThread(hThread, lpExitCode);
              // проверяем код завершения потока
              if lpExitCode = STATUS_SUCCESS then
              ........
              // поток завершился успехом
            end;
          WAIT_TIMEOUT:
            // сработал таймаут
            TerminateThread(hThread, 0);
        end;
      finally
        CloseHandle(hThread);
      end;
    end;
    
     
    #4 alexey-m, 11 Nov 2012
    Last edited: 11 Nov 2012
  5. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    У меня выдает такие ошибки:

    Code:
    function getThread(lpParameters: Pointer): DWORD; stdcall; ==>  dword
    
    ExitThread(Result);  ==> ExitThread
    
    lpExitCode: DWORD;==> DWORD
    
    hThread:= CreateThread(nil, 0, @getThread, nil, 0, PDWORD(nil)^);  ==> CreateThread и  PDWORD
    
    case WaitForSingleObject(hThread, timeout) of WAIT_OBJECT_0: ==> WaitForSingleObject и WAIT_OBJECT_0:
    
    GetExitCodeThread(hThread, lpExitCode);  ==>  GetExitCodeThread
    
    Result:= STATUS_SUCCESS; но я так понимаю что нужно сделать тут так: Result:= 'STATUS_SUCCESS';
     
    #5 bertys, 11 Nov 2012
    Last edited: 11 Nov 2012
  6. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    bertys, судя по ошибкам у тебя windows в uses не прописан, так как все эти типы там определены, STATUS_SUCCESS - это DWORD, а не сторока
     
  7. bertys

    bertys New Member

    Joined:
    25 Jan 2012
    Messages:
    162
    Likes Received:
    0
    Reputations:
    0
    Прописал виндовс в юзес

    STATUS_SUCCESS Всеравно выдает ошибку
     
  8. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    ну а загуглить не судьба, а так можно возвращать любое значение в ExitThread(Result); не обязательно STATUS_SUCCESS, хоть 1, 2, 22 - все это будут коды завершения потока, по которым можно обрабатывать ошибки или судить о успешности его выполнения
    Code:
    type
      NT_STATUS = Cardinal;
    const
      STATUS_SUCCESS = NT_STATUS($00000000);