![]() |
|
Программирование C / C++ / Visual C++ / Delphi / Visual Basic / ASM / Windows / Pascal |
|
Опции темы
![]() |
Оценить тему
![]() |
![]() |
#1 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
Сканирование портов!
Как в delphi организовать сканирование подсети на открытый порт. Я делаю так::::::::
============================== ========== procedure TForm1.FormCreate(Sender: TObject); var incet:integer; begin incet:=0; while incet<244 do begin ClientSocket1.Host:='30.40.55. '+inttostr(incet); ClientSocket1.Active:=true; inc(incet); end procedure TForm1.ClientSocket1Connect(Se nder: TObject; Socket: TCustomWinSocket); begin ClientSocket1.Socket.SendText( 'Порт найден'); ClientSocket1.Active:=false; end; ============================== ================= Но нихрена не прет.. но если в этой строчке while incet<244 do вместо 244 поставить число в диапазоне от 5 до 30 до нормально.. Кто знает , вчем причина! ![]()
__________________
Кто сколько и на сколько... и кто против кого... финал один... |
![]() |
![]() |
#2 |
Участник
Регистрация: 07.02.2005
Сообщений: 632
ICQ: 4888488 Репутация: 55
|
![]()
ошибка вознакает при начале работы сканера или уже поле например нескольки просканированных?
__________________
cup.[SU] |
![]() |
![]() |
#3 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
если выставляю в while incet<244 do любое чило в диапазоне 5-30 вместо 244 то сервер получает сообщение что порт открыт.. А если ставлю 244 то сервер нихера не получает.. просто весь диапазон сканируеться и все..
![]()
__________________
Кто сколько и на сколько... и кто против кого... финал один... |
![]() |
![]() |
#4 | |
Участник
Регистрация: 09.01.2005
Сообщений: 176
Репутация: 2
|
![]() Цитата:
А ты какие порты-то пытаешься сканить? Не пробовал указывать, например, ClientSocket1.Port := Номер_порта (integer)
__________________
115788290 Завидую крокодилам! Потому что они даже ходят лежа! |
|
![]() |
![]() |
#6 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
Мое сканирование происходит должно происходить так.
На своей тачке запускаю Клиента. После. Запускаем уже прогу на удаленной тачке,на форме которой клиент и сервер.Сервак открывает порт например 7777. А клиент сканирует всю подсеть на открытый порт и если такой существует, то соединяеться и отсылает сообщене уже ко мне на тачку на мой сервер ClientSocket1.Sock.SendText('П орт открыт').Вот и все.. Только нихрена не получаеться.. ![]() Какие еще варианты есть????
__________________
Кто сколько и на сколько... и кто против кого... финал один... Последний раз редактировалось Stinger; 21.06.2005 в 12:54. |
![]() |
![]() |
#7 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
Вот нашел исходник сканирует диапазон IP на открытые порты.
Как сделать так чтобы при окончании сканирования не вылетало сообщение Connection Timeout И при нажатии кнопки "Остановит" во время сканирование сообщение Connection Failed Надо както эти сообщения нейтрализовать!
__________________
Кто сколько и на сколько... и кто против кого... финал один... Последний раз редактировалось Stinger; 22.06.2005 в 00:51. |
![]() |
![]() |
#8 |
Участник
Регистрация: 25.06.2005
Сообщений: 9
ICQ: 320196997 Репутация: 1
|
![]()
Используй компонент TCPClent (uses Sockets, вкладка Internet)
там есть функция Connect, так короче и правильнее будет. uses ... Sockets; ... type TForm1 = class(TForm) TcpClient1: TTcpClient; ... procedure TForm1.FormCreate(Sender: TObject); var incet:integer; begin incet:=0; TCPClient1.RemotePort := '777'; while incet<244 do begin TCPClient1.RemoteHost:='30.40. 55.'+inttostr(incet); if TCPClient1.Connect then begin TCPClient1.Disconnect; ShowMessage('Найден хост ' + TcpClient1.RemoteHost); end; inc(incet); end; end; Последний раз редактировалось G_Mitrich; 27.06.2005 в 06:39. |
![]() |
![]() |
#9 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
У меня нет компонента TTCPClient в моей Delphi.
Версия Delphi 6. По поиску искал компонент тоже не нашел.. можь у кого есть? ![]()
__________________
Кто сколько и на сколько... и кто против кого... финал один... Последний раз редактировалось gemaglabin; 26.06.2005 в 18:36. |
![]() |
![]() |
#10 |
Участник
Регистрация: 25.06.2005
Сообщений: 9
ICQ: 320196997 Репутация: 1
|
![]()
Он в делфи 7. На, установи модуль Sockets.
Извлеки модуль, потом в дельфи нажми Component=>Install Component В поле Unit File Name укажи путь к файлу Sockets.pas. Нажми кнопку ОК. Потом закрой .dpk проект сохранив изменения, на вкладке Internet должны появиться 3 новых компонента: TCPServer, TCPClient, UDPSocket. (Это чтобы не было непоняток) Последний раз редактировалось G_Mitrich; 27.06.2005 в 08:26. |
![]() |
![]() |
#11 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
Не могу установить этот компонент..
Все делаю правильно уверен. Вылетает ошибка. >>>>>> Требует inet60. Сохраняю dp проект. в файле dpk добавляю inet60 потом вроде установил но нихера нигде этот компонент не появился ни в какой закладке. Че за херь не пойму ???
__________________
Кто сколько и на сколько... и кто против кого... финал один... Последний раз редактировалось Stinger; 02.07.2005 в 17:32. |
![]() |
![]() |
#12 |
Участник
Регистрация: 25.06.2005
Сообщений: 9
ICQ: 320196997 Репутация: 1
|
![]()
Ладно, фиг с ним, с етим ТСПКлиентом, Делай на КлиентCокете, только немного по-другому:
procedure TForm1.FormCreate(Sender: TObject); var incet:integer; begin incet:=0; ClientSocket1.ClientType := ctBlocking; while incet<244 do begin try ClientSocket1.Host:='30.40.55. '+inttostr(incet); ClientSocket1.Active:=true; if ClientSocket1.Active then begin ClientSocket1.Socket.SendText( 'Ïîðò íàéäåí'); ClientSocket1.Active:=false; end; except end; inc(incet); end; end; При не удачном конекте отладчик будет бухтеть, так что прогу запускай не из-под дебугера, работать усё будет. Не работало у тя потому, что ты использовал асинхронный режим сокета, он ещё не сделал попытки приконектиться к одному ип, ты ужо меняешь на другой и делаешь реконект, с блокирующим режимом всё должно работать (Только компилятор орать истошно будет :)). P.S. Компоненты могли появиться на панели Samples Последний раз редактировалось G_Mitrich; 02.07.2005 в 20:21. |
![]() |
![]() |
#13 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
Не хреново паше с ClientSocket1.ClientType := ctBlocking;
Прога виснет и медленно сканит .. вооще жопа.. А если через ClientSocket1.ClientType := ctNonBlocking; Не виснет работает все нормально но сканит медленно. Народ подскажите исходник быстро-работающего сканера. ![]()
__________________
Кто сколько и на сколько... и кто против кого... финал один... |
![]() |
![]() |
#14 |
Участник
Регистрация: 15.11.2004
Сообщений: 72
Репутация: 1
|
![]()
Что значит "быстрого".Для тог, чтобы законектится на порт, нужно время.Его ты по-любому не уберешь.Можно конечно уменьшить время ожидания отклика сканируемого порта, но это черевато (при плохом канале или конекте можно просто проскочить).Удинственный выход разбить весь сканируемый диапазон на несколько частей и организовать N-ное число потоков.Тогда все , будет происходить в N раз быстрее.Ну и уменьшить время ожидания отклика до разумных пределов.
__________________
...появились мы на свет, Боже, вот тебе, принимай какие есть, делай выводы... |
![]() |
![]() |
#15 |
Участник
Регистрация: 07.02.2005
Сообщений: 632
ICQ: 4888488 Репутация: 55
|
![]()
если руки не кривые то посмотри этот пример сканирования айпи на диапазон портов выполненный на winsock.Его легко переделать
работает достаточно быстро,код документирован
__________________
cup.[SU] |
![]() |
![]() |
#16 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
gemaglabin
Выводит ошибку типа неопознанный или неописанный объект hEvent := WSACreateEvent(); Мне кажеться дело в том что при подключении winsock2 у меня тоже вылезла ошибка у меня просто такого модуля нет (Delphi 6 а у тебя наверно 7 или выше) и пришлось подключить просто winsock. Где достать winsock2 или если у тебя есть приаттачь!
__________________
Кто сколько и на сколько... и кто против кого... финал один... |
![]() |
![]() |
#17 |
Участник
Регистрация: 07.02.2005
Сообщений: 632
ICQ: 4888488 Репутация: 55
|
![]()
вообщето можно было и на обычном 1.1 винсоке
__________________
cup.[SU] |
![]() |
![]() |
#18 | |
Участник
Регистрация: 25.06.2005
Сообщений: 9
ICQ: 320196997 Репутация: 1
|
![]() Цитата:
|
|
![]() |
![]() |
#19 |
Участник
Регистрация: 06.11.2004
Сообщений: 90
Репутация: 52
|
![]()
gemaglabin как я и говорил этот winsock2 ошибку исправил.. потом код подправлю, чтобы можно было IP диапазон сканить.. тода скорость скажу.. нормальная или херовая.
G_Mitrich ты прав через мопед сканю.
__________________
Кто сколько и на сколько... и кто против кого... финал один... |
![]() |
![]() |
#20 |
Участник
Регистрация: 25.06.2005
Сообщений: 9
ICQ: 320196997 Репутация: 1
|
![]()
Вот накидал пример с потоками, работает довольно шустро...
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Winsock, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a : array[0 .. 255] of Byte; implementation {$R *.dfm} procedure RunThread(p : Pointer); const mask = '213.189.243.'; port = 80; var S:TSocket; A:TSockAddr; IP : String; Buf : String; begin try Buf := 'Port is opened!'; IP := Mask + IntToStr(Byte(p^)); A.sin_family := AF_INET; A.sin_addr.S_addr := inet_addr(pchar(IP)); A.sin_port := htons(port); S := socket(AF_INET, SOCK_STREAM, 0); if S=INVALID_SOCKET then Exit; if connect(S, A, sizeof(A)) = 0 then begin Send(S, Buf[1], Length(Buf), 0); Form1.Memo1.Lines.Add(IP); end; CloseSocket(S); except end; end; procedure TForm1.Button1Click(Sender: TObject); var I : Byte; T : DWord; WSA : WSAData; begin WSAStartUp($101, WSA); Memo1.Lines.Clear; for I := 0 to 255 do begin a[I] := I; BeginThread(nil, 1024, @RunThread, @a[I], 0, T); end; end; end. Последний раз редактировалось gemaglabin; 10.08.2005 в 18:27. |
![]() |