Newsgroup: it.comp.lang.perl
Titolo: Numero massimo di connessioni

Premetto che sono nuovo , anzi nuovissimo con il perl.
Ho scritto questo semplice script che dovrebbe consentire in ingresso 1 
SOLA connessione.
Invece effettuando un telnet localhost 5000, di connessioni ne ottengo 
quante ne voglio.
Eppure nella Listen e' specificato 1 !!!!!!
Per il resto funziona: effettua il fork dei processi, visualizza, il 
buffer etc.
Possibile che solo questa cosina di m....a mi deve rovinare il mio primo
programmino in perl ?
Uso Linux con perl 5.8.6 e lancio il programmino con
$perl 
conn.pl
Grazie a tutti colori che mi sapranno aiutare a risolvere il mistero !
Ciao
Andrea
------------------------CUT HERE --------------------------
use strict;
use IO::Socket;
my $IpAddress="0.0.0.0";
my $Port="5000";
my $MaxConn=1;
my $Buffer="Ciao - Sei connesso !\n";
my $Client;
my $Pid;
#Creo il Socket
my $Server = IO::Socket::INET->new(Listen => $MaxConn,
                                    LocalHost => $IpAddress,
                                    LocalPort => $Port,
                                    Proto => 'tcp',
                                    ReuseAddr => 0) || die "socket: $!";
print"Server in ascolto sulla porta Tcp/$Port\n";
while (1) {
         #Attendo le connessioni in ingresso
         $Client=$Server->accept();
         #Creo un processo figlio
         $Pid=fork();
         #Nel caso fossi il figlio invio un messagio al nuovo client
         if (!($Pid)) {
                 send ( $Client, $Buffer, 0);
                 while(1){}
         }
         #Altrimenti torno all'inizio
}
--------------------------------CUT HERE --------------------

 SOLA connessione.
Che cosa ti ha convinto che quel paramentro serva a limitare il numero di 
connessioni contemporanee?
Se leggi perldoc IO::Socket::INET, vedrai che dice:
    Listen      Queue size for listen
Quel paramtro corrisponde al secondo parametro di listen(2)
   int listen(int s, int backlog);
   The backlog parameter defines the maximum length the queue
   of pending connections may grow to.
Max

Ti ringrazio per la risposta !
Ma allora c'e' un modo per limitare il numero massimo di connessioni
in ingresso ?
Ciao
Andrea


 in ingresso ?
Ci deve pensare l'applicazione. La tecnica dipende dalla streategia che 
vuoi usare per gestire le connessioni: creare un figlio per ogni 
connessione, pre-instanziare N figli che servano N connessioni 
contemporanee, servire tutte le connessioni contemporaneamente in un unico 
processo, usare i thread, etc. Visto che sei "nuovissimo con il Perl", 
anziché procedere per tentativi, ti consiglierei (oltre a leggere manuali, 
FAQ, tutorial) a studiarti del codice esistente per vedere come certe cose 
vanno fatte. Ad esempio, potresti guardarti il codice del modulo 
Net::Server:
 
 
http://search.cpan.org/~rhandom/Net-Server-0.90/
   Net::Server   Extensible, general Perl server engine 
Max

 --------------------------------CUT HERE --------------------
Altrimenti con
use POSIX();
all' inizio e al posto di wait(); metti POSIX::pause(); che blocca il
processo fino all' arrivo di un signal e quando arriva SIGCHLD si sblocca
e il ciclo si conclude fino a ritornare ad accept. Questa seconda soluzione
pero' non e' ortodossa, ti rimane un zombie e in piu' devi gestire il
signal handler SIGCHLD e bloccare gli altri....
Nessuna delle due soluzioni e' veramente ortodissa. Se ad esempio vuoi
gestire non una ma es. 5 connessioni devi per forza gestire il signal
handler per contare i processi che decrementano, ma il contatore deve
essere protetto da race-conditions con POSIX::sigprocmask() ....
perldoc POSIX
perldoc -f wait
e per curiosita'
man 2 listen
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it