Stranice: [1]   Idi dole
  Štampaj  
Autor Tema: Kako razlikovati klijente?  (Pročitano 3619 puta)
VRider
Gost
« poslato: Četvrtak, 04. April 2002. 22:10:22 »

Kada napisem server u perlu, za svakog klijenta se otvara pomocni soket preko koga se vrsi razmena (accept(new_sock, old_sock)). Ako je na server istovremeno zakaceno vise klijenata kako ih server raspoznaje? Npr. Ako je 5 klijenata istovremeno vezano za server, kako da u 1501 klijentu 3 posaljem poruku "Zdravo", pa potom u 1505 klijentu 5 poruku "Ciao".
Sačuvana
mire
Gost
« Odgovor #1 poslato: Četvrtak, 04. April 2002. 23:41:56 »

accept poziv po default-u blokira sto znaci da verovatno imas situaciju dosao klijent, nesto se desilo, klijent otisao i ti ponovo cekas na novog.

Svaki put kad dobijes klijenta u new_sock stavi ga u neki hash i moci ces da posle radis sa njim. Ono sto tebi verovatno treba je jedan program sa non-blocking socket-ima ili situacija gde se server svaki put forkuje kada dobije socket (puno jednostavnije). Pogledaj IO::Socket i IO::Select module a mozes da razmotris i xinetd. To su sve mnogo jednostavnije stvari od pisanja koda u C maniru. Dok threadovi ne postanu stabilni i kada procenis da ti fork nije toliko potreban (jede memoriju ili sta vec) POE moze da pomogne a pogotovo olaksava upotrebu socket-a (nedostatak je sto svaka operacija mora sto pre da se zavrsi posto se sve radi u jednom thread-u).
Sačuvana
mire
Gost
« Odgovor #2 poslato: Nedelja, 07. April 2002. 13:46:33 »

Evo i primera u kodu:

[code:1:5052b03f2e]
#!/usr/bin/perl

use IO::Socket;
use IO::Select;

# Create a socket to listen on.
#
my $listener = IO::Socket::INET->new( LocalPort => 8008, Listen => 5, Reuse => 1 );

die "Can't create socket for listening: $!" unless $listener;
print "Listening for connections on port 8008n";

my $readable = IO::Select->new;     # Create a new IO::Select object
$readable->add($listener);          # Add the listener to it

while(1) {

    # Get a list of sockets that are ready to talk to us.
    #
    my ($ready) = IO::Select->select($readable, undef, undef, undef);
    foreach my $s (@$ready) {
   
        # Is it a new connection?
        #
        if ($s == $listener) {
   
            # Accept the connection and add it to our readable list.
            #
            my $new_sock = $listener->accept;
            $readable->add($new_sock) if $new_sock;
       
            print $new_sock "Welcome!rn";
       
        } else {  # It's an established connection
   
            my $buf = <$s>;   # Try to read a line
       
            # Was there anyone on the other end?
            #
            if( defined $buf ) {
           
                # If they said goodbye, close the socket. If not,
                # echo what they said to us.
                #
                if ($buf =~ /goodbye/i) {
                    print $s "See you later!n";
                    $readable->remove($s);
                    $s->close;
                } else {
                    print $s "You said: $bufn";
                }
           
            } else { # The client disconnected.
       
                $readable->remove($s);
                $s->close;
                print STDERR "Client Connection closedn";
           
            }
        }
    }
}
[/code:1:5052b03f2e]
Sačuvana
VRider
Gost
« Odgovor #3 poslato: Nedelja, 07. April 2002. 20:44:28 »

Mire,
ako mi posaljes sliku, zakacicu je iznad kompjutera kao ikonu!
Sačuvana
mire
Gost
« Odgovor #4 poslato: Ponedeljak, 08. April 2002. 07:55:37 »

Mozemo da se dogovorimo Wink

Nego jel' ti ovo radi posao ?

BTW Firma za koju obavljam contract work je izrazila zelju da preko svog site-a obucim ljude mod_perl programiranju posto su im potrebni takvi ljudi. Plata je veoma fina za nase uslove a program pocinje ...
Sačuvana
Stranice: [1]   Idi gore
  Štampaj  
 
Prebaci se na:  

?>