- Perl Socket, NuINu, 09:40 , 18-Июн-07 (1)
>простейший IRC-бот отсылающий виндовый NetSend на канал > > >send( TO_SERVER, "PRIVMSG ...\r\n", 0 ); прекрасно работает в предке, а вот >потомок отправляет send() только один раз, после чего "подвисает" ("цикл" в >котором работает снифер останавливается) Ну и где тот код в котором подвисает потомок? этот сенд что ли? и все? нельзяли расширить пример? >как обеспечить взаимодействие снифера с IRC? мда. это скорее филосовский вопрос ;-)
- Perl Socket, JIP, 10:19 , 18-Июн-07 (2)
>>send( TO_SERVER, "PRIVMSG ...\r\n", 0 ); прекрасно работает в предке, а вот >>потомок отправляет send() только один раз, после чего "подвисает" ("цикл" в >>котором работает снифер останавливается) >Ну и где тот код в котором подвисает потомок? этот сенд что >ли? и все? нельзяли расширить пример? >sub netsend { my $pid = fork; return undef unless defined $pid; return $pid if $pid != 0; while( 1 ) { send( TO_SERVER, "PRIVMSG ...\r\n", 0 ); sleep( 1 ); } } вот так примерно :) > >>как обеспечить взаимодействие снифера с IRC? >мда. это скорее филосовский вопрос ;-)
- Perl Socket, NuINu, 15:54 , 18-Июн-07 (3)
>>>send( TO_SERVER, "PRIVMSG ...\r\n", 0 ); прекрасно работает в предке, а вот >sub netsend >{ > my $pid = fork; > > return undef unless defined $pid; > return $pid if $pid != 0; > > while( 1 ) > { > send( TO_SERVER, "PRIVMSG ...\r\n", >0 ); > sleep( 1 ); > } >} > >вот так примерно :) ;-)) ну эта конструкция "примерно" должна работать без проблем!!! я с IRC не работал у меня есть некий сервер записывающий лог и возвращающий иногда эхо, переделав чуть твоего клиента у меня получилась прога-клиент, в которой родитель иногда пишет в этот сокет, а его потомок "снифер" тоже пишет в этот сокет принятый лог пакетов. Вообщем то все работает.
- Perl Socket, JIP, 16:01 , 18-Июн-07 (4)
>Вообщем то все работает. интересная ситуация :) типа "дайте мне другой глобус" :) IRC-клиент отлично работает - не падает, отвечает на пинги и тд. все корректно реализовано. снифер посылает сетевые попапы в STDIN без проблем. обе системы хорошо функционируют. не думал о том что реализация взаимодействия может стать проблемой send() срабатывает - на канале отображается одно сообщение. после этого тишина
- Perl Socket, NuINu, 16:26 , 18-Июн-07 (5)
>>Вообщем то все работает. > > >интересная ситуация :) типа "дайте мне другой глобус" :) >IRC-клиент отлично работает - не падает, отвечает на пинги и тд. >все корректно реализовано. >снифер посылает сетевые попапы в STDIN без проблем. >обе системы хорошо функционируют. не думал о том что реализация взаимодействия может >стать проблемой >send() срабатывает - на канале отображается одно сообщение. после этого тишина слушай, а может ты на этот канал снифер запустишь? посмотреть что нам на уровне езернета происходит? - Perl Socket, NuINu, 16:34 , 18-Июн-07 (6)
>>Вообщем то все работает. > > >интересная ситуация :) типа "дайте мне другой глобус" :) >IRC-клиент отлично работает - не падает, отвечает на пинги и тд. >все корректно реализовано. >снифер посылает сетевые попапы в STDIN без проблем. >обе системы хорошо функционируют. не думал о том что реализация взаимодействия может >стать проблемой >send() срабатывает - на канале отображается одно сообщение. после этого тишина все равно наверняка где нибудь в логике есть ошибка! вот у меня есть двух потоковый клиент, он спокойно отсылает(а один поток еще и принимает ответы от сервера) сообщения. все работает: -------------- #!/usr/bin/perl -w use strict; use IO::Socket; use POSIX 'WNOHANG'; my $MAX_STR = 20; my $quit = 0; my $esc = "^\e"; $SIG{'INT'} = sub {$quit++}; $SIG{CHLD} = \&REAPER;
my $host = shift || 'localhost'; my $port = shift || 2007; my $socket = IO::Socket::INET->new("$host:$port") or die $@; my $snif_pid = &netsend; print "My pid: $$,sniffer work with pid: $snif_pid\n"; my ($in, $msg_in); while(!$quit) { if(defined($in = <>)) { if($in =~ m/^quit\n$/) {last;} print $socket $in; $msg_in = <$socket>; print "SERV: $msg_in"; } } print "The END!\n"; $socket->close or warn $@; exit(0); sub REAPER { while( (my $wpid = waitpid(-1, WNOHANG)) > 0) { warn "Reaper child with PID $wpid\n"; } } sub netsend {
my $pid = fork; return undef unless defined $pid; return $pid if $pid != 0; my $count = 1; # Я тестирую клиент сервер на локальном компе, в реале что бы их пакеты не мешали реальному дампу # надо применять фильтрацию и использовать другую команду my $input_stream = "sudo /usr/sbin/tcpdump -i eth0 -ne|"; open(IN, $input_stream); my $str_in; while(defined($str_in = <IN>)) { print $socket "PRIVMSG$str_in"; #print $str_in; if($count >= $MAX_STR) { print "sending $count. BASTA!!!\n"; last; } $count++; sleep(1); } #Когда мы закрываем входящий поток "не дочитав до конца у нас при закрытии процесса толи в stdout #то ли stderr вываливается несколько завершающих строк из потока. #а ну да мы закрываем IN и он убивает tcpdump а он как раз после INT выводит сколько он пакетов прочитал. close(IN) or warn $@; $socket->close or warn $@; exit(0); }
- Perl Socket, JIP, 11:15 , 19-Июн-07 (7)
&форкер работает нормально если отсутствует цикл 'while ( defined( my $msg = <$socket> ) )': периодически посылает 'bip' на канал :) проблема осталась попробую ковырять готовые решенияuse strict; use warnings; use IO::Socket; my $socket = IO::Socket::INET->new( PeerAddr => 'serv_ip', PeerPort => 6669, Proto => 'tcp', Type => SOCK_STREAM ) or die "couldn't connect: $@\n"; print $socket "NICK 'nick'\r\n"; #идентификация print $socket "USER 'ident' 0 * :'nick'\r\n"; # print $socket "JOIN #chann\r\n"; #заходит на канал &forker; while ( defined( my $msg = <$socket> ) ) { if ( $msg =~ /^PING\s:/ ) { $msg =~ /^PING\s+:(\S+)/; print $socket "PONG :$1\r\n"; } } close( $socket ); sub forker { my $pid = fork; return undef unless defined $pid; return $pid if $pid != 0; while ( 1 ) { print $socket "PRIVMSG #chann :bip\r\n"; sleep( 5 ); } close( $socket ); }
- Perl Socket, NuINu, 12:00 , 19-Июн-07 (8)
>&форкер работает нормально если отсутствует цикл 'while ( defined( my $msg = <$socket> ) )': периодически посылает 'bip' на канал :) >проблема осталась я не понял ты что сокет в двух задачах читаешь? так работать не будет! читать надо в одном месте. иначе тебе на твой бип, может прийти какой нибудь пинг(если на бип вообще приходят ответы, я IRC протокол не знаю) и т.п. если хочешь получать что то из сокета в форкере, надо 1) открыть пайп в майн программе, 2) передать второй его конец форкеру 3) в майн цикле чтения сокета, выделять данные которые предназначены для форкера и писать их в пайп. 4) соответственно форкер должен его обрабатывать.>попробую ковырять готовые решения принципиальной разницы в моем клиенте и готовом решении не вижу, читает в одном месте сокет, пишет в двух, должно работать.
- Perl Socket, JIP, 12:34 , 19-Июн-07 (9)
>>&форкер работает нормально если отсутствует цикл 'while ( defined( my $msg = <$socket> ) )': периодически посылает 'bip' на канал :) >>проблема осталась >я не понял ты что сокет в двух задачах читаешь? так работать >не будет! читать надо в одном месте. иначе тебе на твой >бип, может прийти какой нибудь пинг(если на бип вообще приходят ответы, >я IRC протокол не знаю) и т.п. если хочешь получать что >то из сокета в форкере, надо 1) открыть пайп в майн >программе, 2) передать второй его конец форкеру >3) в майн цикле чтения сокета, выделять данные которые предназначены для форкера >и писать их в пайп. 4) соответственно форкер должен его обрабатывать. > > >>попробую ковырять готовые решения >принципиальной разницы в моем клиенте и готовом решении не вижу, читает в >одном месте сокет, пишет в двух, должно работать. читаю из сокета в одно месте: $msg = <$socket>. это нужно для взаимодействия с сервером тк он пинги посылает и требуется на них отвечать. &форкер только пишет в сокет (по мере поступления сообщений от снифера). таким образом читается из сокета в оном месте ($msg = <$socket>) а пишется из предка и потомка. это отображено в исходнике.
- Perl Socket, NuINu, 13:30 , 19-Июн-07 (10)
>читаю из сокета в одно месте: $msg = <$socket>. это нужно для взаимодействия с сервером тк он пинги посылает и требуется на них отвечать. >&форкер только пишет в сокет (по мере поступления сообщений от снифера). >таким образом читается из сокета в оном месте ($msg = <$socket>) а пишется из предка и потомка. это отображено в исходнике.так это и есть твой исходник? я думал это просто пример сторонних разработчиков. ну значит должно работать!!! не знаю тогда почему у тебя не работает! и как это чтение может влиять на запись в сокет. тем более из другого процесса.
- Perl Socket, JIP, 18:49 , 19-Июн-07 (11)
>так это и есть твой исходник? я думал это просто пример сторонних >разработчиков. >ну значит должно работать!!! >не знаю тогда почему у тебя не работает! и как это чтение >может влиять на запись в сокет. тем более из другого процесса. > мой исходник) крокодил не ловится, не растет кокос буду ковыряться в готовых irc либах
|