The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Perl Socket"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Perl Socket"  
Сообщение от JIP email(??) on 18-Июн-07, 07:40 
простейший IRC-бот отсылающий виндовый NetSend на канал

socket( TO_SERVER, PF_INET, SOCK_STREAM, getprotobyname( 'tcp' ) ;

#далее подключение к IRC-серверу. передача аутентификационных данных

&netsend; #запускается снифер

while( <TO_SERVER> ) #обработка сообщений полученных из IRC
{
}

#снифер живет в отдельном процессе
sub netsend
{    
    my $pid = fork;
    
    return undef unless defined $pid;
    return $pid if $pid != 0;
    
    #далее код который ловит netsend и после обработки должен выплевывать его в IRC
}    

send( TO_SERVER, "PRIVMSG ...\r\n", 0 ); прекрасно работает в предке, а вот потомок отправляет send() только один раз, после чего "подвисает" ("цикл" в котором работает снифер останавливается)
как обеспечить взаимодействие снифера с IRC?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

  • Perl Socket, NuINu, 09:40 , 18-Июн-07, (1)  
    • Perl Socket, JIP, 10:19 , 18-Июн-07, (2)  
      • Perl Socket, NuINu, 15:54 , 18-Июн-07, (3)  
        • Perl Socket, JIP, 16:01 , 18-Июн-07, (4)  
          • Perl Socket, NuINu, 16:26 , 18-Июн-07, (5)  
          • Perl Socket, NuINu, 16:34 , 18-Июн-07, (6)  
            • Perl Socket, JIP, 11:15 , 19-Июн-07, (7)  
              • Perl Socket, NuINu, 12:00 , 19-Июн-07, (8)  
                • Perl Socket, JIP, 12:34 , 19-Июн-07, (9)  
                  • Perl Socket, NuINu, 13:30 , 19-Июн-07, (10)  
                    • Perl Socket, JIP, 18:49 , 19-Июн-07, (11)  

Сообщения по теме [Сортировка по времени, UBB]


1. "Perl Socket"  
Сообщение от NuINu (??) on 18-Июн-07, 09:40 
>простейший IRC-бот отсылающий виндовый NetSend на канал
>
>
>send( TO_SERVER, "PRIVMSG ...\r\n", 0 ); прекрасно работает в предке, а вот
>потомок отправляет send() только один раз, после чего "подвисает" ("цикл" в
>котором работает снифер останавливается)
Ну и где тот код в котором подвисает потомок? этот сенд что ли? и все? нельзяли расширить пример?


>как обеспечить взаимодействие снифера с IRC?
мда. это скорее филосовский вопрос ;-)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Perl Socket"  
Сообщение от JIP email(??) on 18-Июн-07, 10:19 
>>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?
>мда. это скорее филосовский вопрос ;-)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Perl Socket"  
Сообщение от NuINu (??) on 18-Июн-07, 15:54 
>>>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 не работал у меня есть некий сервер записывающий лог и возвращающий иногда эхо, переделав чуть твоего клиента у меня получилась прога-клиент, в которой родитель иногда пишет в этот сокет, а его потомок "снифер" тоже пишет в этот сокет принятый лог пакетов.
Вообщем то все работает.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Perl Socket"  
Сообщение от JIP email(??) on 18-Июн-07, 16:01 
>Вообщем то все работает.


интересная ситуация :) типа "дайте мне другой глобус" :)
IRC-клиент  отлично работает - не падает, отвечает на пинги и тд. все корректно реализовано.
снифер посылает сетевые попапы в STDIN без проблем.
обе системы хорошо функционируют. не думал о том что реализация взаимодействия может стать проблемой
send() срабатывает - на канале отображается одно сообщение. после этого тишина

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Perl Socket"  
Сообщение от NuINu (??) on 18-Июн-07, 16:26 
>>Вообщем то все работает.
>
>
>интересная ситуация :) типа "дайте мне другой глобус" :)
>IRC-клиент  отлично работает - не падает, отвечает на пинги и тд.
>все корректно реализовано.
>снифер посылает сетевые попапы в STDIN без проблем.
>обе системы хорошо функционируют. не думал о том что реализация взаимодействия может
>стать проблемой
>send() срабатывает - на канале отображается одно сообщение. после этого тишина
слушай, а может ты на этот канал снифер запустишь? посмотреть что нам на уровне езернета происходит?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Perl Socket"  
Сообщение от NuINu (??) on 18-Июн-07, 16:34 
>>Вообщем то все работает.
>
>
>интересная ситуация :) типа "дайте мне другой глобус" :)
>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);
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Perl Socket"  
Сообщение от JIP email(??) on 19-Июн-07, 11:15 
&форкер работает нормально если отсутствует цикл '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 );
}    

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Perl Socket"  
Сообщение от NuINu (??) on 19-Июн-07, 12:00 
>&форкер работает нормально если отсутствует цикл 'while ( defined( my $msg = <$socket> ) )': периодически посылает 'bip' на канал :)
>проблема осталась
я не понял ты что сокет в двух задачах читаешь? так работать не будет! читать надо в одном месте. иначе тебе на твой бип, может прийти какой нибудь пинг(если на бип вообще приходят ответы, я IRC протокол не знаю) и т.п. если хочешь получать что то из сокета в форкере, надо 1) открыть пайп в майн программе, 2) передать второй его конец форкеру
3) в майн цикле чтения сокета, выделять данные которые предназначены для форкера и писать их в пайп. 4) соответственно форкер должен его обрабатывать.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Perl Socket"  
Сообщение от JIP email(??) on 19-Июн-07, 12:34 
>>&форкер работает нормально если отсутствует цикл 'while ( defined( my $msg = <$socket> ) )': периодически посылает 'bip' на канал :)
>>проблема осталась
>я не понял ты что сокет в двух задачах читаешь? так работать
>не будет! читать надо в одном месте. иначе тебе на твой
>бип, может прийти какой нибудь пинг(если на бип вообще приходят ответы,
>я IRC протокол не знаю) и т.п. если хочешь получать что
>то из сокета в форкере, надо 1) открыть пайп в майн
>программе, 2) передать второй его конец форкеру
>3) в майн цикле чтения сокета, выделять данные которые предназначены для форкера
>и писать их в пайп. 4) соответственно форкер должен его обрабатывать.
>
>
>>попробую ковырять готовые решения
>принципиальной разницы в моем клиенте и готовом решении не вижу, читает в
>одном месте сокет, пишет в двух, должно работать.


читаю из сокета в одно месте: $msg = <$socket>. это нужно для взаимодействия с сервером тк он пинги посылает и требуется на них отвечать.
&форкер только пишет в сокет (по мере поступления сообщений от снифера).
таким образом читается из сокета в оном месте ($msg = <$socket>) а пишется из предка и потомка. это отображено в исходнике.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Perl Socket"  
Сообщение от NuINu (??) on 19-Июн-07, 13:30 
>читаю из сокета в одно месте: $msg = <$socket>. это нужно для взаимодействия с сервером тк он пинги посылает и требуется на них отвечать.
>&форкер только пишет в сокет (по мере поступления сообщений от снифера).
>таким образом читается из сокета в оном месте ($msg = <$socket>) а пишется из предка и потомка. это отображено в исходнике.

так это и есть твой исходник? я думал это просто пример сторонних разработчиков.
ну значит должно работать!!!
не знаю тогда почему у тебя не работает! и как это чтение может влиять на запись в сокет. тем более из другого процесса.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Perl Socket"  
Сообщение от JIP email(??) on 19-Июн-07, 18:49 
>так это и есть твой исходник? я думал это просто пример сторонних
>разработчиков.
>ну значит должно работать!!!
>не знаю тогда почему у тебя не работает! и как это чтение
>может влиять на запись в сокет. тем более из другого процесса.
>


мой исходник) крокодил не ловится, не растет кокос
буду ковыряться в готовых irc либах

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру