Newsgroup: it.comp.lang.c
Titolo: problema con socket

Salve a tutti,
ho questa porzione di codice:
       if( read(connfd,&buff,sizeof(buff)) < 0)
        { perror("richiesta non pervenuta"); return 1;}
       printf("buffer: %s",buff);
mi sono accorto che quando viene eseguito il programma si blocca e il 
codice che viene dopo va in esecuzione solo quando premo Ctrl+C.
Ho provato ad utilizzare una select in questo modo:
FD_SET(connfd, &fset);
   if( select(connfd + 1, &fset, NULL, NULL, NULL) )
   { /* Ci sono dati disponibili, posso iniziare una lettura */
     if(FD_ISSET(connfd,&fset))
     { /* arrivo dei dati */
       if( read(connfd,&buff,sizeof(buff)) < 0)
        { perror("richiesta non pervenuta"); return 1;}
       printf("\n*");
     }
   }
purtroppo il risultato è lo stesso, qualcuno sa come posso risolvere?
Si ringrazia anticipatamente per l'attenzione

 Ho provato ad utilizzare una select in questo modo:
Esaminando solo la porzione di codice che hai riportato ti posso dire
che la printf() fa un output bufferizzato, mentre la read fa input NON
bufferizzato. Per igiene del codice le tue tecniche non andrebbero mai
mescolate. Io credo che ti veda l' output delle printf() solo alla fine
del programma perche' e' li' che si svuota il buffer.
Prova a sostituire con write(1,buff,numerocaratterilettiritornatodaread);
o piu' formale write(fileno(stdout),....);
se hai bisogno di formattare l' output usa sprintf su una stringa e poi
fai output non bufferizzato con write, altrimenti non vedtai in output
a tempo di esecuzione, ma solo quando le libc decideranno di svuotare il
buffer.
ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Strettamente parlando questo codice è errato.
Ci sono 2 problemi:
1) buff viene stampato con printf (e %s) ma non è '\0' terminato.
        int n;
        /* ... */
        n = read(connfd,buff,sizeof(buff)-1);       /* notare il -1 e & non
serve in &buff */
        if (n < 0) {
            perror("richiesta non pervenuta");
            return 1;
        }
        buff[n] = '\0';  /* 0-terminare */
        printf("buffer: %s",buff); /* solo ora si può stampare con %s e
printf */
        ovviamante suppongo che buff sia dichiarato così:
            char buff[DIMBUFF];
            con DIMBUFF > 1
        Se non si fà in questo modo ci possono essere problemi di
segmentation-fault perchè
        printf non è in grado di trovare il termine di buff (la read non
'\0'-termina !!!).
2) Per vedere l'output di printf() bisogna seguire una delle seguenti
alternative:
        a) printf("buffer: %s\n",buff);        /* \n */
            oppure
        b) printf("buffer: %s",buff);
            fflush(stdout);
            oppure
        c) printf("buffer: %s",buff);
            fflush(NULL);
Inoltre nel seguente:
FD_SET(connfd, &fset);
   if( select(connfd + 1, &fset, NULL, NULL, NULL) )
   { /* Ci sono dati disponibili, posso iniziare una lettura */
     if(FD_ISSET(connfd,&fset))
     { /* arrivo dei dati */
       if( read(connfd,&buff,sizeof(buff)) < 0)
        { perror("richiesta non pervenuta"); return 1;}
       printf("\n*");
     }
   }
(a) FD_ZERO(...) è stata usata su connfd ?
(b) i dati arrivano ? altrimenti "select" si blocca !
(c) * in printf("\n*");
potrebbe non essere stampato per i motivi appena detti.
Meglio printf("*\n");
Provare a non mettere un timeout infinito, ma solo di qualche secondo, in
select.  :-)
Giorgio Silvestri

 ha scritto nel messaggio
news:b5pug.42129$zy5.8...@twister1.libero.it...

In realtà l'unico metodo garantito è (a).
Giorgio Silvestri


ti rigrazio per i preziosi consigli

 
Grazie mille :)