Просмотр полной версии : [PERL] Сканер портов. Требуется помощь
Есть сканер портов на перле...сканит диапазон ипов на один открытый порт...скорость откровенно крейсерная... поправьте ошибки и помогите прикрутить многопоточность
#!/usr/bin/perl
use IO::Socket;
use threads;
use threads::shared;
print "Enter Start Host: ";
my $startip=<STDIN>;
print "Enter End Host: ";
my $endip=<STDIN>;
checkrange();
sub checkrange
{
print "\n Start scaning...\n\n";
my @flist=split(/\./, $startip);
my @tlist=split(/\./, $endip);
my $fip=$flist[0]*256*256*256+$flist[1]*256*256+$flist[2]*256+$flist[3];
my $tip=$tlist[0]*256*256*256+$tlist[1]*256*256+$tlist[2]*256+$tlist[3];
for (my $i=$fip; $i<=$tip; $i++) {
my $tmp=$i;
my $d1=int($tmp / (256*256*256)); $tmp=$tmp-$d1*(256*256*256);
my $d2=int($tmp / (256*256)); $tmp=$tmp-$d2*(256*256);
my $d3=int($tmp / 256); $tmp=$tmp-$d3*256;
my $d4=$tmp;
my $ip="$d1.$d2.$d3.$d4";
sock($ip);
}
sub sock {
my $sock = new IO::Socket::INET
(
PeerAddr => $_[0],
PeerPort => '80',
PeerProto => 'tcp',
t => '5',
);
if($sock) {
print "$_[0] is Good\n";
}else{
print"$_[0] is Bad\n"
}
}
}
print "Scaning finished. Press Enter to exit.";
$exit = <STDIN>;
biophreak
04.11.2008, 00:15
Тут недавно вроде как уже был подобный вопрос...исходники тоже есть)
я прошу поправить конкретно мой случай
люди ну ап в конце концов...репой не обижу
ненавижу перл! перл учат лохи. (c) KSURi.
ненавижу перл! перл учат лохи. (c) KSURi.
Чоткие пасаны все кодят на асме?
Kaimi ты же прошарен в перле...помоги новичку освоиться в нём
biophreak
05.11.2008, 16:33
Нене...чоткее пасаны ждут похапе 6 и собираются кодить на нем... =\
чоткие патсаны на кубейсеке кодят
какой то страшный код, особенно вот это повергло в шок
my $fip=$flist[0]*256*256*256+$flist[1]*256*256+$flist[2]*256+$flist[3];
=\\\ это что за пздц? я даже код боюсь разбирать
Помню слип писал небольшой сканер ипов по порту, поищи
Мб канеш с этим кто то поможет, но не я =(
Меня пугает код) + Дофига сканеров портов по диапазону быстрых, зачем именно на перле
ну вот мне нужен конкретно на перле...мож у кого сорцы завалялись? ну или поправьте этот в конце концов..он работает..нужно только могопоточность прикрутить
use warnings;
use IO::Socket;
use threads;
use threads::shared;
print "Enter Start Host: ";
my $startip = <>;
print "\nEnter End Host: ";
my $endip = <>;
print "\nThreads number: ";
my $thr = <>;
print "\n Start scaning...\n\n";
my @flist=split(/\./, $startip);
my @tlist=split(/\./, $endip);
my $fip=$flist[0]*256*256*256+$flist[1]*256*256+$flist[2]*256+$flist[3];
my $tip=$tlist[0]*256*256*256+$tlist[1]*256*256+$tlist[2]*256+$tlist[3];
my $i : shared = $fip;
my @trl;
for(0..$thr) {$trl[$_] = threads->create(\&checkrange, $_);}
for(@trl) { $_->join; }
sub checkrange
{
while($i<=$tip) {
my $tmp;
{lock($i); $i++; $tmp=$i;}
my $d1=int($tmp / (256*256*256)); $tmp=$tmp-$d1*(256*256*256);
my $d2=int($tmp / (256*256)); $tmp=$tmp-$d2*(256*256);
my $d3=int($tmp / 256); $tmp=$tmp-$d3*256;
my $d4=$tmp;
my $ip="$d1.$d2.$d3.$d4";
sock($ip);
}
}
sub sock {
my $ip = shift;
my $sock = new IO::Socket::INET
(
PeerAddr => $ip,
PeerPort => '80',
PeerProto => 'tcp',
t => '5',
);
print $sock ? ("$ip is Good\n") : ("$ip is Bad\n");
}
print "Scaning finished. Press Enter to exit.";
$exit = <STDIN>;
Один из лучших сканеров портов написан на перл а точнее nmap
Я бы на вашем месте посмотрел его исходники.
zer0ska
Written in C, C++, Python
Один из лучших сканеров портов написан на перл а точнее nmap
да ладно :D
Kaimi не корректно работает...почему то всегда 10 потоков :(
Серверную винду поставь... или патч стек tcp/ip
пёрл умрет. останутся лишь интерпритаторы и все.
Точно, давайте дружно песать на яве
пузи, http://www.google.com/search?q=perl6
его обещания только ложь!
P.S.: читайте новости. abc рулит!
ты смешон
кто из нас смешон?
http://216.239.59.104/search?q=cache:DToLCztY8HUJ:www.tiobe.com/tiobe_index/index.htm+%22Programming+Language+Popularity%22&hl=ru&ct=clnk&cd=2&client=opera
biophreak
05.11.2008, 22:33
Спасибо,поржал :)
PHPoozy: Хм...а то пых под натиском питона, явы и прочего не умрет?
или ты сидишь дро^W молишься на пхп6 ? :))
ЗЫЖ Думаю, тем кому нужен перл или тем кому тупо удобнее на нем писать - для тех он не умрет :)Или предлагаешь писать простые скрипты-однострочники на PHP^W быдлоязыках?
ЗЗЫЖ Все вышенаписанное лишь личное мнение...
май ланг ис пайтон. питон всех порвет в скором будущем!
PHPoozy: Хм...а то пых под натиском питона, явы и прочего не умрет?
или ты сидишь дро^W молишься на пхп6 ? )
я молюсь на python 3000 =)
P.S.: PHP 94 тоже не молод.
biophreak
05.11.2008, 22:42
Гм...ну ты уж определись чтоли похапе или питон.... :))
В скором будущем, я думаю, уже не надо будет заморачиваться насчет этого, ибо производительность железа будет такой, что хоть на кубейсике клепай cgi, дело каждого - на чем он пишет, может кому-то удобнее пхп, кому-то перл, кому-то C# итд итп...а вот из-за тебя,как видишь - сплошной оффтоп пошел(или ты просто посты набивал) ;)))
ЗЫЖ А вы, товарищ, как я посмотрю - любитель похоливарить на пустом месте :)
ЗЫЖ А вы, товарищ, как я посмотрю - любитель похоливарить на пустом месте
оксиконтин хочешь?
не пойду, там пхп-пинч
да, там вирус! написан на пхп =)
это надо так засрать тему...2 страницы оффтопа...поналепить бы всем минусов
Серверную винду поставь... или патч стек tcp/ip
не в этом деле..даже если 2 потока поставлю всё равно делает 10
С чего ты взял что создается именно 10 потоков?
посчитал когда он работал
Sharky, там в самом начале было что-то про оптимизацию, так вот у меня вопрос в связи с этим: "А какая именно часть работает долго? Та что вычисляет ip адреса или что осуществляет подключение?"
Соответственно предложение следующее: если долго вычисляются ip-шники, то надо менять код их вычисления! На мой взгляд можно было все это сделать намного проще и передавать в функцию пинг готовый ip.
Если вычисляется сравнительно быстро (по сравнению с пингом), то выносить каждый пинг в отдельный поток. Правда, насколько я знаю, потоки действенны, когда их кол-во до 16 штук.
сама генерация ипов вроде быстро проходит...а вот коннекты долго
Kaimi они выводятся по 10 штук за раз
А на каком диапазоне ты проверяешь? Почему именно 10? если увеличить диапазон, что-то меняется?
А по поводу оптимизации кода:
for (my $i=$fip; $i<=$tip; $i++) заменить на for ($fip .. $tip)
$ip="$d1.$d2.$d3.$d4"; заменить на $ip=join ".", ($d1,$d2,$d3,$d4);
print "$_[0] is Good\n"; заменить на print $_[0]." is Good\n";
После этого производительность должна увеличится на доли миллисекунд. :-) Но это факт!
И вообще вычисление ip-шников вынести в отдельную функцию.
И тогда программа должна работать по следующему алгоритму:
1)Получаем начальный и конечный ip;
2)Вычисляем все ip, которые будем пинговать, и переписываем их в общий массив;
3)Для каждого ip из общего массива создаем отдельный поток, который будет вызывать функцию sock();
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot