PDA

Просмотр полной версии : Delphi, задачка


Knight_of_Darkness
14.07.2007, 22:24
Вот бьюсь над реализацией одной задачи. Нужно проверить, можно ли приконнектиться к 80 порту удаленной машины или нет. Пытался разными способами... Ставил сокетный клиент и обрабатывал OnConnect, пытался ставить таймер, обрабатывать Connected.. Вобщем, если кто-то предложит готовый рабочий пример, снимаю шляпу..

W!z@rD
15.07.2007, 01:00
1. Кидаешь на форму TcpClient
2. Указываешь порт 80
3. обрабатываешь событие OnConnect

не работает?? о_О

Knight_of_Darkness
15.07.2007, 01:05
пробовал, в случае удачного коннекта выдает асинхронную ошибку 10060.

W!z@rD
15.07.2007, 01:21
обработка события OnError
ErrorCode:=0;

и все :)

Kpeamop
15.07.2007, 03:59
1. Кидаешь на форму TcpClient
2. Указываешь порт 80
3. обрабатываешь событие OnConnect


нафига эти компаненты TcpClient, когда можно нормально замутить,
вот готовый пример, если че тока модифицируй его:


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 ;{ВОТ ТУТ ПОДСОЕДИНИЛИСЬ ИНАЧЕ НЕТ}
closesocket(S);
{ Завершаем работу с сокетами }
WSACleanup;
end.

W!z@rD
15.07.2007, 04:30
Kpeamop боян??!?!
что я не решил задачу?? о_О

Joker-jar
15.07.2007, 06:36
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, думаю, обертка для делфни есть у любого уважающего себя программера.

Knight_of_Darkness
15.07.2007, 09:57
Так, ладн.. всем спасибо. Дуйствующий пример подсказал первым W!z@rd, за что ему ставлю плюс...

gemaglabin
15.07.2007, 10:11
Виз подсказал способ типа "работает а и йух с ним" , так лучше не делать.Рабочие примеры тебе дали

Knight_of_Darkness
15.07.2007, 21:24
Виз, есть еще трабла

поставил indy-компонент, посылаю get-запрос и смотрю сорец. Но если натыкаюсь на 404 он ругается и вылетает.
Как вообще отлавливать ошибки в IdHTTP? Не находил такого. На низкий уровень пока переходить не хочу, т.к. я всё-таки не сканер пишу.

Knight_of_Darkness
16.07.2007, 21:41
С ошибками разобрался, если запускать не через конпелятор и использовать try..except, всё работает тихо.

W!z@rD
16.07.2007, 22:58
все... надолбал тебе програмку.. /руки у мну кривые... ой какие... мля... ((
http://slil.ru/24639108
многопоточный сканер IP диапазонов... (мягко сказано (( мля диапазон вручную надо вводить... надо будет переделаю)
в архиве сорцы+бинарник...

Knight_of_Darkness
20.07.2007, 17:09
Перезалей плз, линка не жива.. я отсутствовал просто

W!z@rD
20.07.2007, 20:45
Перезалью когда дома появлюсь...

webfile.ru/1477014

все качай!!!!!!!!!!!

Knight_of_Darkness
24.07.2007, 07:27
Не называй это сканнером.. он работает еще медленнее моего.

W!z@rD
24.07.2007, 15:04
мдя...
тут понимаешь-ли помогаешь, а тебя в dev/null кинули :)
что попросил, то и сделал что не нравится? о_О
поставленная цель достиженна!

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

da_ff
24.07.2007, 23:25
=) цель достигнута

Knight_of_Darkness
24.07.2007, 23:56
Виз, не надо всё так драматизировать.
Отписал тебе в асю:
он очень долго сканит
не знаю во сколько там потоков, но у меня работало гораздо быстрее
может можно понизить таймаут?