The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Perl Socket, !*! JIP, 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?

  • 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 либах




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

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