The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"Perl Socket"
Отправлено NuINu, 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);
}

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

На сайте действует частичное премодерирование - после публикации некоторые сообщения от анонимов могут автоматически скрываться ботом. После проверки модератором ошибочно скрытые сообщения раскрываются. Для ускорения раскрытия можно воспользоваться ссылкой "Сообщить модератору", указав в качестве причины обращения "скрыто по ошибке".



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

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