Вот бьюсь над реализацией одной задачи. Нужно проверить, можно ли приконнектиться к 80 порту удаленной машины или нет. Пытался разными способами... Ставил сокетный клиент и обрабатывал OnConnect, пытался ставить таймер, обрабатывать Connected.. Вобщем, если кто-то предложит готовый рабочий пример, снимаю шляпу..
1. Кидаешь на форму TcpClient 2. Указываешь порт 80 3. обрабатываешь событие OnConnect не работает?? о_О
нафига эти компаненты 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.
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, думаю, обертка для делфни есть у любого уважающего себя программера.
Виз, есть еще трабла поставил indy-компонент, посылаю get-запрос и смотрю сорец. Но если натыкаюсь на 404 он ругается и вылетает. Как вообще отлавливать ошибки в IdHTTP? Не находил такого. На низкий уровень пока переходить не хочу, т.к. я всё-таки не сканер пишу.
С ошибками разобрался, если запускать не через конпелятор и использовать try..except, всё работает тихо.
все... надолбал тебе програмку.. /руки у мну кривые... ой какие... мля... (( http://slil.ru/24639108 многопоточный сканер IP диапазонов... (мягко сказано (( мля диапазон вручную надо вводить... надо будет переделаю) в архиве сорцы+бинарник...
мдя... тут понимаешь-ли помогаешь, а тебя в dev/null кинули что попросил, то и сделал что не нравится? о_О поставленная цель достиженна! и еще нюанс, не надо меня бить, но если просишь помощи не надо бурлить помогающих *просто я стараюсь предерживаться этики..* хм... хотя этичнй человек не когда бы такого не сказал (ну в этом духе)
Виз, не надо всё так драматизировать. Отписал тебе в асю: он очень долго сканит не знаю во сколько там потоков, но у меня работало гораздо быстрее может можно понизить таймаут?