Delphi, задачка

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Knight_of_Darkness, 14 Jul 2007.

  1. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    Вот бьюсь над реализацией одной задачи. Нужно проверить, можно ли приконнектиться к 80 порту удаленной машины или нет. Пытался разными способами... Ставил сокетный клиент и обрабатывал OnConnect, пытался ставить таймер, обрабатывать Connected.. Вобщем, если кто-то предложит готовый рабочий пример, снимаю шляпу..
     
    1 person likes this.
  2. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    1. Кидаешь на форму TcpClient
    2. Указываешь порт 80
    3. обрабатываешь событие OnConnect

    не работает?? о_О
     
  3. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    пробовал, в случае удачного коннекта выдает асинхронную ошибку 10060.
     
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    обработка события OnError
    ErrorCode:=0;

    и все :)
     
    2 people like this.
  5. Kpeamop

    Kpeamop Member

    Joined:
    4 Jan 2007
    Messages:
    24
    Likes Received:
    10
    Reputations:
    0
    нафига эти компаненты TcpClient, когда можно нормально замутить,
    вот готовый пример, если че тока модифицируй его:

    Code:
    program connect;
    
    uses
      sysutils, winsock;
    
    var  D:WSAData;
         S:TSocket;
         A:TSockAddr;
    begin
    if WSAStartup($101,D)<>0 then halt;
    {Определяем тип семейства сокетов, и IP адрес}
    A.sin_family:=AF_INET;
    A.sin_addr.S_addr:=inet_addr('127.0.0.1');
    { Создаем сокет }
      S:=socket(AF_INET,SOCK_STREAM,0);
      { Если возвращено значение INVALID_SOCKET, выводим сообщение об ошибке }
      if S=INVALID_SOCKET then halt;
      { Определяем порт (задается константой) }
      A.sin_port:=htons(80);
      { Пытаемся подконнектиться, если удачно - выводим сообщение, что порт открыт }
      if connect(S,A,sizeof(A))=0 then ;[B]{ВОТ ТУТ ПОДСОЕДИНИЛИСЬ ИНАЧЕ НЕТ}[/B]
      closesocket(S);
    { Завершаем работу с сокетами }
    WSACleanup;
    end.
    
     
    #5 Kpeamop, 15 Jul 2007
    Last edited: 15 Jul 2007
  6. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Kpeamop боян??!?!
    что я не решил задачу?? о_О
     
  7. Joker-jar

    Joker-jar Elder - Старейшина

    Joined:
    11 Mar 2007
    Messages:
    581
    Likes Received:
    205
    Reputations:
    37
    Code:
    function PingPort(host: string; portnum: word; tim: integer): boolean;
    var
      s, opt: Integer;
      FSocket: TSOCKET;
      busy : boolean;
      addr : TSockAddr;
      hEvent : THandle;
      fset : TFDset;
      tv : TTimeval;
      GInitData : TWSADATA;
    
    function LookupName(host: string): TInAddr;
    var
      HostEnt: PHostEnt;
      InAddr: TInAddr;
    begin
      HostEnt := gethostbyname(PChar(host));
      FillChar(InAddr, SizeOf(InAddr), 0);
      if HostEnt <> nil then
        begin
          with InAddr, HostEnt^ do
            begin
              S_un_b.s_b1 := h_addr^[0];
              S_un_b.s_b2 := h_addr^[1];
              S_un_b.s_b3 := h_addr^[2];
              S_un_b.s_b4 := h_addr^[3];
            end;
        end;
      Result := InAddr;
    end;
    
    begin
      result := false;
      WSAStartup(MAKEWORD(2,0), GInitData);
      addr.sin_family := AF_INET;
      addr.sin_addr.s_addr := INADDR_ANY;
      addr.sin_port := htons(portnum);
      hEvent := WSACreateEvent();
      busy:=false;
      FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
      WSAEventSelect(FSocket, hEvent, FD_WRITE + FD_CONNECT);
      addr.sin_addr := LookupName(host);
      connect(FSocket, @addr, sizeof(addr));
      if WSAGetLastError()=WSAEINPROGRESS then
        begin
          closesocket (FSocket);
          busy:=true;
        end;
      FD_Zero(fset);
      if busy <> true then
        FD_SET (FSocket, fset);
      tv.tv_sec := tim;
      tv.tv_usec := 0;
      s:=select (1, nil, @fset, nil, @tv);
      if busy then
        exit;
      if FD_ISSET (FSocket, fset) then
        begin
          s:=Sizeof(Opt);
          opt:=1;
          getsockopt(FSocket, SOL_SOCKET, SO_ERROR, @opt, s);
          if opt=0 then
            result := true;
          closesocket(FSocket);
        end;
      WSACloseEvent(hEvent);
      WSACleanup;
    end;
    
    procedure main;
    begin
      if PingPort('ya.ru', 80, 2) then
        messagebox(0,'Порт открыт', nil, mb_ok or mb_iconinformation);
    end;
    Уже выкладывал на форуме. Продвинутая функция сканирования порта. Третий параметр - таймаут в секундах. В большинстве случаев одной секунды хватает, чтобы определить, открыт порт или нет. Зависимость - winsock2, думаю, обертка для делфни есть у любого уважающего себя программера.
     
    #7 Joker-jar, 15 Jul 2007
    Last edited: 15 Jul 2007
  8. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    Так, ладн.. всем спасибо. Дуйствующий пример подсказал первым W!z@rd, за что ему ставлю плюс...
     
    1 person likes this.
  9. gemaglabin

    gemaglabin Green member

    Joined:
    1 Aug 2006
    Messages:
    772
    Likes Received:
    842
    Reputations:
    1,369
    Виз подсказал способ типа "работает а и йух с ним" , так лучше не делать.Рабочие примеры тебе дали
     
    1 person likes this.
  10. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    Виз, есть еще трабла

    поставил indy-компонент, посылаю get-запрос и смотрю сорец. Но если натыкаюсь на 404 он ругается и вылетает.
    Как вообще отлавливать ошибки в IdHTTP? Не находил такого. На низкий уровень пока переходить не хочу, т.к. я всё-таки не сканер пишу.
     
    #10 Knight_of_Darkness, 15 Jul 2007
    Last edited: 16 Jul 2007
  11. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    С ошибками разобрался, если запускать не через конпелятор и использовать try..except, всё работает тихо.
     
  12. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    все... надолбал тебе програмку.. /руки у мну кривые... ой какие... мля... ((
    http://slil.ru/24639108
    многопоточный сканер IP диапазонов... (мягко сказано (( мля диапазон вручную надо вводить... надо будет переделаю)
    в архиве сорцы+бинарник...
     
  13. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    Перезалей плз, линка не жива.. я отсутствовал просто
     
  14. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Перезалью когда дома появлюсь...

    webfile.ru/1477014

    все качай!!!!!!!!!!!
     
    #14 W!z@rD, 20 Jul 2007
    Last edited: 23 Jul 2007
  15. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    Не называй это сканнером.. он работает еще медленнее моего.
     
  16. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    мдя...
    тут понимаешь-ли помогаешь, а тебя в dev/null кинули :)
    что попросил, то и сделал что не нравится? о_О
    поставленная цель достиженна!

    и еще нюанс, не надо меня бить, но если просишь помощи не надо бурлить помогающих
    *просто я стараюсь предерживаться этики..*
    хм... хотя этичнй человек не когда бы такого не сказал (ну в этом духе)
     
  17. da_ff

    da_ff Elder - Старейшина

    Joined:
    11 Jul 2006
    Messages:
    118
    Likes Received:
    22
    Reputations:
    26
    =) цель достигнута
     
  18. Knight_of_Darkness

    Knight_of_Darkness Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    69
    Likes Received:
    68
    Reputations:
    24
    Виз, не надо всё так драматизировать.
    Отписал тебе в асю:
    он очень долго сканит
    не знаю во сколько там потоков, но у меня работало гораздо быстрее
    может можно понизить таймаут?