Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

27.10.2008, 20:59
|
|
Участник форума
Регистрация: 05.12.2007
Сообщений: 113
Провел на форуме: 252598
Репутация:
34
|
|
Perl многопоточночть
Подскажите как скрипт такого вида cделать многопоточным или дайте ссылки на нормальные мануалы по много поточности perl.
Код:
#!/usr/bin/perl
use Socket;
%ipr = ('192.168.0.1' => '1',
'192.168.0.2' => '2',
'192.168.0.3' => '3');
$p='135';
foreach $ip (keys %ipr){
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$iaddr = inet_aton($ip);
$paddr = sockaddr_in($p, $iaddr);
if(connect(SOCK, $paddr)) {
print $ip." [connect]\r\n";
}
else {
print $ip." [error]\r\n";
}
# send (SOCK, "", 0);
close(SOCK);
$i++;
}
|
|
|

27.10.2008, 21:07
|
|
Members of Antichat - Level 5
Регистрация: 09.10.2006
Сообщений: 1,698
Провел на форуме: 9098076
Репутация:
4303
|
|
Код:
#!/usr/bin/perl
use Socket;
use threads;
use threads::shared;
my @ipr : shared;
$thr = 2; # потоки
@ipr = ('192.168.0.1', '192.168.0.2', '192.168.0.3');
$p='135';
for(0..$thr)
{
$trl[$_] = threads->create(\&Prog, $_);
}
for(0..$thr)
{
$trl[$_]->join;
}
sub Prog {
while (@ipr){
$ip = shift;
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$iaddr = inet_aton($ip);
$paddr = sockaddr_in($p, $iaddr);
if(connect(SOCK, $paddr)) {
print $ip." [connect]\r\n";
}
else {
print $ip." [error]\r\n";
}
# send (SOCK, "", 0);
close(SOCK);
$i++;
}
}
Вроде так, только я там заюзал через массив, а не через хеш
Последний раз редактировалось Spyder; 27.10.2008 в 21:16..
|
|
|

27.10.2008, 21:23
|
|
Members of Antichat - Level 5
Регистрация: 09.10.2006
Сообщений: 1,698
Провел на форуме: 9098076
Репутация:
4303
|
|
spyder@local:~> perl tt.pl
0 [error]
1 [error]
Thread 1 terminated abnormally: Bad arg length for Socket:  ack_sockaddr_in, length is 0, should be 4 at /usr/lib/perl5/5.10.0/i586-linux-thread-multi/Socket.pm line 386.
Thread 2 terminated abnormally: Bad arg length for Socket:  ack_sockaddr_in, length is 0, should be 4 at /usr/lib/perl5/5.10.0/i586-linux-thread-multi/Socket.pm line 386.
2 [error]
Thread 3 terminated abnormally: Bad arg length for Socket:  ack_sockaddr_in, length is 0, should be 4 at /usr/lib/perl5/5.10.0/i586-linux-thread-multi/Socket.pm line 386.
ошибки вываливаются, я думаю надо поставить проверку на не пустое значение $ip что бы их небыло
|
|
|

28.10.2008, 01:54
|
|
Познающий
Регистрация: 08.03.2008
Сообщений: 46
Провел на форуме: 77313
Репутация:
17
|
|
То что ты делаешь наверное можно сделать простым форком.
Но раньше стандартный билды перла не подерживает потоки хоть модуль был.
Для того, что их юзать надо было перекомпилировать перл
Теперь вот я что прочитал
http://perldoc.perl.org/threads.html
Как я понял, создаёться копия перла на каждый поток. Переменый не являються общими. И для скрипта это выглядит как форк.
Вывод использовать форк проще всего или взять язык который разработан для правильной работы в потоками (умеет синхронизировать код)
|
|
|

28.10.2008, 17:26
|
|
Участник форума
Регистрация: 05.12.2007
Сообщений: 113
Провел на форуме: 252598
Репутация:
34
|
|
!
Вот что я своими силама накодил поправте если где ошибки )
Код:
#!/usr/bin/perl
use threads;
use Socket;
%ipr = ('192.168.0.1' => '1',
'192.168.0.2' => '2',
'192.168.0.3' => '3');
$p='135';
$i =0;
foreach $ip (keys %ipr){
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$thr[$i]=threads->create(\&test_connect, $ip, $p);
$iaddr = inet_aton($ip);
$paddr = sockaddr_in($p, $iaddr);
close(SOCK);
$i++;
}
sub test_connect {
$iaddr = inet_aton($ip);
$paddr = sockaddr_in($p, $iaddr);
if(connect(SOCK, $paddr)) {
print $ip." [connect]\r\n";
return $ip;
}
else {
print $ip." [error]\r\n";
return $ip;
}
# send (SOCK, "", 0);
return;
}
|
|
|

28.10.2008, 18:07
|
|
Reservists Of Antichat - Level 6
Регистрация: 23.08.2007
Сообщений: 1,237
Провел на форуме: 18127311
Репутация:
1676
|
|
Код:
use warnings;
use strict;
use Socket;
use threads;
use threads::shared;
my @trl;
my $p = '135';
my $threads = 2;
my @ipr : shared = qw(192.168.1.1 192.168.1.2 192.168.1.3);
for(0..$threads) {$trl[$_] = threads->create(\&check, $_);}
for(@trl) { $_->join; }
sub check {
my $ip;
while(@ipr) {
{lock(@ipr); $ip = shift(@ipr);}
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
my $iaddr = inet_aton($ip);
my $paddr = sockaddr_in($p, $iaddr);
connect(SOCK, $paddr) ? (print "$ip [connect]\r\n") : (print "$ip [error]\r\n");
close(SOCK);
}
}
|
|
|

28.10.2008, 18:07
|
|
Постоянный
Регистрация: 03.08.2007
Сообщений: 367
Провел на форуме: 876216
Репутация:
209
|
|
use warnings 'all';
use strict;
use diagnostics;
и правь 
PS: И не лучше-ли сделать цикл вне функции?
Последний раз редактировалось biophreak; 28.10.2008 в 18:42..
|
|
|

28.10.2008, 18:45
|
|
Members of Antichat - Level 5
Регистрация: 09.10.2006
Сообщений: 1,698
Провел на форуме: 9098076
Репутация:
4303
|
|
fry, юзать форки для этой задачи не имеет смысла, куда проще и быстрее сделать всё с потоками
|
|
|

30.10.2008, 16:47
|
|
Участник форума
Регистрация: 05.12.2007
Сообщений: 113
Провел на форуме: 252598
Репутация:
34
|
|
!
Вот так сказать последняя версия :-)
Код:
#!/usr/bin/perl
use threads;
use Socket;
$p = '139';
$sip = '192.168.0.';
for(1..255) {
$ip = '192.168.0.'.$_;
$thr[$_]=threads->create(\&conn, $ip, $p, SOCK)->join;
}
sub conn {
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$iaddr = inet_aton($ip);
$paddr = sockaddr_in($p, $iaddr);
if(connect(SOCK, $paddr)) {
print $ip."\r\n";
close(SOCK);
return;
}
else {
close(SOCK);
return;
}
# send (SOCK, "", 0);
return;
}
посоветуйте как по грамотней распределять потоки потому что диапазон может быть не только от 0 до 255 но и больше а создавать 1000 потоков имхо не есть гуд )
Как лучше создовать сокет внутри фнкции или создать один а в функции юзать только connect ?
|
|
|

30.10.2008, 16:58
|
|
Moderator - Level 7
Регистрация: 16.02.2008
Сообщений: 580
Провел на форуме: 1595333
Репутация:
291
|
|
ну дак ты попробуй и тем и другим способом. посмари в каком случае быстрее с помощью time-a и сделай так как тебе выгодно.
|
|
|
|
 |
|
Похожие темы
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
|
BookS: PHP, PERL, MySQL, JavaScript, HTML, ajax, Веб Дизайн
|
M1nK0 |
PHP, PERL, MySQL, JavaScript |
10 |
27.06.2009 21:35 |
|
Books Perl
|
FRAGNATIC |
PHP, PERL, MySQL, JavaScript |
0 |
11.08.2005 16:58 |
|
Безопасность приложений на Perl
|
k00p3r |
Чужие Статьи |
0 |
12.06.2005 09:39 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|