Newsgroup: it.comp.os.linux.development
Titolo: select su socket udp bloccante?

Ciao,
per imparare ho realizzato un piccolo server udp, usando select()
evitare che il server si blocchi in attesa di ricevere dati. Tuttavia
la mia chiamata a select() si blocca finché non arrivano dati.
Il codice semplificato è:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {
    struct sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_port = htons(20000);
    address.sin_addr.s_addr = htons(INADDR_ANY);
    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    bind(sock, (struct sockaddr *) &address, sizeof(address));
    char recv_buffer[1024];
    struct sockaddr_in sender;
    socklen_t sender_len = sizeof(sender);
    while (true) {
        fd_set rsock;
        FD_ZERO(&rsock);
        FD_SET(sock, &rsock);
        select(sock + 1, &rsock, NULL, NULL, NULL);
        printf("select done\n");
        if (FD_ISSET(sock, &rsock)) {
            recvfrom(sock, recv_buffer, 1024, 0,
                    (struct sockaddr *) &sender, &sender_len);
            printf("received data\n");
        }
        else
            printf("data not available\n");
    }
    return(EXIT_SUCCESS);
}
Il comportamento che osservo è che "select done" non viene stampato
finché non arrivano dati, e comunque "data not available" non viene
mai stampato, segno che si comporta in maniera bloccante.
dove sbaglio?
grazie in anticipo

 grazie in anticipo
ti consiglio man 2 select e man 2 select_tut
ciao
riki

 impostato con il valore di timeout.
grazie, in effetti ho letto male il man, per ottenere quel
comportamento si deve impostare entrambi i campi di timeout a zero,
non passare NULL.

 dove sbaglio?
La funzione della select() è appunto quello di monitorare l'attività 
di uno più descrittori in attesa che su uno di essi siano disponibili 
dati ed in modo tale che le successive azioni (p.e. una read() e/o una 
recvfrom()) non siano bloccanti.
Ma se non vi sono dati la select() si blocca in attesa di eventi e può 
essere interrotta dal timeout.
Nel caso dell'esempio e con un solo socket la select() è del tutto 
inutile.  Sarebbe invece necessaria se vi fossero più descrittori da 
monitorare ed evitare che essendo il programma bloccato su di uno di 
essi non sia possibile monitorare gli altri.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

 essi non sia possibile monitorare gli altri.
sì, certo, ma il codice è solo un esempio. Il ciclo reale deve fare
altro mentre non arrivano i dati.
per il comportamento bloccante è vero, avevo letto male la pagina man,
credevo timeout a null significasse niente attesa, invece si deve
impostare i campi tv_sec e tv_usec entrambi a zero.
grazie

 essi non sia possibile monitorare gli altri.
Usare select/poll con un solo file descriptor e` pratica comune per fare I/O con 
timeout (cfr. Stevens)...
P.S. Io preferisco usare la poll().
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch