Newsgroup: it.comp.os.linux.development
Titolo: socket recv e send &accept

Salve ragazzi ho un problemino,
ho fatto uno stupido server che fa questo:
int main(void)
{
struct sockaddr_in addr,him;
int sock;
int sock_client;
sock=socket(AF_INET,SOCK_STREAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(8900);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
 
if(bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0)
 {printf("errore bind");
  return 0;
 }
if(listen(sock,1)<0){printf("errore listen");return 0;}
char buff[300];
int z;
while(1)
{
if((sock_client=accept(sock,(struct sockaddr *)&him,&z))<0)
printf("errore");
recv(sock,&buff,256,0);
 
printf("%s",buff);
}
 
 
return  0;
}
poi ho fatto un client che si connette al server e gli invia un paccketto
con send. con ethereal ho visto che la connessione avviene ma il server
si blocca all'accept(non viene esequita la recv) perche'?
Grazie
bss

 si blocca all'accept(non viene esequita la recv) perche'?
Hmmm -- visto che fai recv su sock invece che su sock_client (certamente
errato) mi aspetterei il blocco li`... l'accept dovrebbe completare ma
la recv ovviamente no (perche` la fai sulla socket sbagliata)...
Alex

 Alex
bss

Alex sai che mi succede che se tolgo il while(1) mi funziona
perche'?
e come se tutto funzionasse ma non c'e' output (con il while)
grazie
bss

Salve ragazzi ho un problemino,
ho fatto uno stupido server che fa questo:
int main(void)
{
struct sockaddr_in addr,him;
int sock;
int sock_client;
sock=socket(AF_INET,SOCK_STREAM,0);
addr.sin_family=AF_INET;
addr.sin_port=htons(8900);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
 
if(bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0)
 {printf("errore bind");
  return 0;
 }
if(listen(sock,1)<0){printf("errore listen");return 0;}
char buff[300];
int z;
while(1)
{
if((sock_client=accept(sock,(struct sockaddr *)&him,&z))<0)
printf("errore");
recv(sock,&buff,256,0);
 
printf("%s",buff);
}
 
 
return  0;
}
poi ho fatto un client che si connette al server e gli invia un paccketto
con send. con ethereal ho visto che la connessione avviene ma il server
si blocca all'accept(non viene esequita la recv) perche'?
Grazie
bss



 e come se tutto funzionasse ma non c'e' output (con il while)
while(1) {
        if ((sock_client = accept(sock,(struct sockaddr *)&him,&z)) < 0) {
                printf("errore");
                continue;
        }
        r = recv(sock_client, buff, 256 - 1, 0);
        if (r < 0) {
                printf("errore");
                close(sock_client);
                continue;
        }
        buff[r] = '\0';
        printf("%s\n",buff);
        close(sock_client);
}
Prima  di tutto  se  l'accept  fallisce non  devi  chiamare la  recv. Il
secondo argomento  di recv e`  un puntatore a  char, non un  puntatore a
puntatore a char. Leggi un byte in  meno, in modo da poter aggiungere il
terminatore di  stringa (visto  che passi  il buffer  alla printf). Alla
fine dell'iterazione chiudi il socket.
Quello che accade  e` che il tuo server accetta  la connessione, legge i
dati, esegue le printf e si blocca  di nuovo sulla recv. Non vedi i dati
a video perche` stdout e` line buffered,  e nei dati che stampi non c'e`
un newline.
HTH,
Luca
-- 
Home: 
http://kronoz.cjb.net
La vispa candela bruciava l'erbetta
creando un'essenza alquanto sospetta;
sembrava l'odore di una sacrestia
ma presto mi accorsi che era maria.