Newsgroup: it.comp.lang.perl
Titolo: newbie: server e client socket insieme

Ciao a tutti
come da oggetto sono nuovo del linguaggio
e volevo una dritta da qualcuno di voi.
E' possibile creare una socket server che ascolti su due porte ?
Mi spiego : Ho una socket server che ascolta su una porta in attesa di
dati da
elaborare ma nello stesso tempo dovrei anche aspettare una richiesta
da un client
che deve avere questi dati.
Thread?
Grazie a tutti
e3

 Thread?
No, grazie.
Ciao,
Emanuele.

 Power Over Ethernet? :-o
Pieces of eight
S.

 Power Over Ethernet? :-o
Perl Over Ethernet ;-)

Ciao,
io credo sia sufficiente utilizzare la select, e gestire le chiamate
con un if... per capire se ti chimano per aprire una sessione o per
inviare i dati....
Qui c'è un piccolo esempio:
#!/usr/local/bin/perl
use lib qw( /usr/local/rrdtool-1.2.19/lib/perl ../lib/perl );
use IO::Handle;
use IO::Socket;
use RRDs;
STDOUT->autoflush(1);
my %Severity = (DEBUG => 1,
                INFORMATION => 2,
                WARNING => 3,
                MINOR => 4,
                ERROR => 5,
                CRITICAL => 6);
$s = new IO::Socket::INET (LocalHost => 10.10.216.168,
                              LocalPort => 7891,
                              Proto     => 'tcp',
                              Listen    => 5,
                               Reuse     => 1
                             );
die "Socket could not be created. Reason: $!" unless $s;
#$starttime = time;
do{
$starttime = time;
my $ele = length($starttime);
#print "ele--> $ele\n";
my $last = substr($starttime,8,2);
$resto = $last % 10;
#print "last-> $last [$resto]\n";
}while ($resto !=  0);
my $logFile = "outServer.log";
my $maxSize = 5000*1024;
my $first = 0;
sub writeLog {
   my ($msg_sev, $msg_text) = @_;
   my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time);
   $year = $year + 1900;
   $mon++;
   $sec = sprintf("%2.2d",$sec);
   $min = sprintf("%2.2d",$min);
   $hour = sprintf("%2.2d",$hour);
   $mday = sprintf("%2.2d",$mday);
   $mon = sprintf("%2.2d",$mon);
   my $localtime = "$year-$mon-$mday $hour:$min:$sec";
   if ($Severity{$msg_sev} >= $Severity{INFORMATION}){
     print LOG "[$localtime] - [$msg_sev] - $msg_text\n";
     #print "[$localtime] - [$msg_sev] - $msg_text\n" if ($stealth !=
1);
   }
}
my ($ns, $buf);
my $rrdfile = "/usr/local/rrdtool-1.2.19/bin/Master.rrd";
if (!-e $rrdfile){
  writeLog("INFORMATION", "time to start db $starttime");
  `/usr/local/rrdtool-1.2.19/bin/startMaster $starttime`;
}
if (-e $rrdfile){
writeLog("INFORMATION", "database is ready to work");
}else{
writeLog("ERROR", "database is not ready to work");
exit;
}
use IO::Select;
$read_set = new IO::Select(); # create handle set for reading
$read_set->add($s);           # add the main socket to the set
while (1){
 if (-e $logFile){
    my $size = (stat($logFile))[7];
    if ($size >= $maxSize){
     unlink($logFile);
     if (!open(LOG,">>$logFile")){
       print "Error impossibile aprire il file di log.......\n";
       exit;
     }else {
       LOG->autoflush(1);
     }
    }
 }else{
    if (!open(LOG,">$logFile")){
      print "Error impossibile aprire il file di log.......\n";
      exit;
    }else {
      LOG->autoflush(1);
    }
 }
 if ($first == 0){
   writeLog ("INFORMATION","Inizio loop server");
   $first = 1;
 }
@ready = $read_set->can_read(10);
$ele = scalar(@ready);
   foreach $fh (@ready){
     #print "nel foreach\n";
     if ($fh == $s){
       $new = $s->accept();
       $read_set->add($new);
     }else{
       #print " ramo else\n";
       $buf = <$fh>;
       writeLog("INFORMATION", "$buf");
       RRDs::update("$rrdfile","$buf");
       my $ERR=RRDs::error;
       writeLog("ERROR", "Stato update [$ERR]") if ($ERR ne "");
       $read_set->remove($fh);
       $fh->close;
     }
   }
}
Ciao.


Grazie del suggerimento
e dell'esempio
e3m4cr166

 Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 La regola: "CON SELECT NIENTE IO BUFFERIZZATO!!"
Parole sante ;-)
Ciao,
Emanuele.

 Emanuele.
Ciao Emanuele!
Sono sempre io! Ci ho fatto un talk sull' argomento a IPW 2006, anche
se nessuno ne ha memoria.
Uno di questi giorni ti scrivo in privato.
ciao
Roberto.


 se nessuno ne ha memoria.
Ah! Dunque, il talk me lo ricordo benissimo: parliamo di quello della 
seconda giornata, nel pomeriggio, al termine del quale (e anche durante) 
ci siamo scambiati 4 chiacchiere?
E` che non avevo idea che il "Roberto C" del newsgroup e l'autore del 
talk fossero la stessa persona! Ma pensa tu :-)
(Perň ora che ci penso, forse me ne avevi anche accennato, sempre 
all'IPW, che postavi con questo nome - sě, sono svalvolato bene).
Allora ci ribecchiamo all'IPW 2008 ;-)
Ciao!

ti ho scritto all' indirizzo che indichi qui. e' ancora valido?
