>>Вообщем то все работает.
>
>
>интересная ситуация :) типа "дайте мне другой глобус" :)
>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);
}