Forum Informatica Unict

Vecchi ordinamenti ad esaurimento => Sistemi Distribuiti 1 => Topic started by: alex180788 on 26-09-2010, 22:01:48



Title: dubbio insrvr.c
Post by: alex180788 on 26-09-2010, 22:01:48
// ciclo che accetta le connessioni
   client_addr_len = sizeof(client_addr);
   while ( 1 ) {
      if ((connect_socket =       // diversa da server_socket!
           accept(server_socket,
                  (struct sockaddr *) & client_addr, // cast
                  &client_addr_len)) == -1) {
         perror("accepting");
         close(server_socket);         
         exit(-1);
      }         

scusate ragazzi, magari sara' troppo tardi per leggere codice ma non riesco a capire come fa ad uscire dal while!!!


Title: Re:dubbio insrvr.c
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 27-09-2010, 00:27:03
Così si capisce meglio:

while (1)
{
    if ((connect_socket = accept(server_socket,
                                (struct sockaddr *) & client_addr,
                                &client_addr_len)) == -1)
    {
        perror("accepting");
        close(server_socket);         
        exit(-1);
    }
}


Praticamente si esce dal ciclo while o quando SIGTERM/SIGKILL non viene gestito (nel secondo caso, banalmente), oppure quando la chiamata accept fallisce restituendo l'apposito valore -1
Quote
On success, accept() returns a non-negative integer that is a descriptor for the accepted socket.
On error, -1 is returned, and errno is set appropriately.
nel qual caso si entra nel corpo del costrutto "if" e si esegue come terza istruzione la chiamta a exit  |-O.


Title: Re:dubbio insrvr.c
Post by: alex180788 on 27-09-2010, 08:48:32
se accept fallisce e restituisce -1 ci sono.... ma se va bene e NON restituisce -1 il while non continua a ciclare???... in teoria dovrebbe uscire dal while una volta che ha accettato una richiesta dalla coda delle connect.....


Title: Re:dubbio insrvr.c
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 27-09-2010, 14:23:39
Ovviamente un esempio di server reale, dopo questo if, inserirebbe del codice per fare qualcosa (ad es. I/O) con connect_socket, ma per la didattica questo esempio è sufficiente per capire il funzionamento generale.

Questo è un programma che non deve terminare mai in modo esplicito (ciclo while infinito), deve rimanere in attesa di connessioni e accettarle pian piano finché non viene terminato da fuori o per un errore.