x-t
24-06-2007, 16:10
Salve a tutti!
Sto avendo un problema con i socket UDP.
Per inviare/ricever un buffer utilizzo le funzioni sendto(...) recvfrom(...).
Ad esempio, per l'invio:
if (sendto(s, buffer_invio, dimensione_buffer_invio, 0,(struct sockaddr*)&peeraddr_in, &addrlen) != 1) {fprintf(stderr, "Connection aborted on error"); exit(1);}
e per la ricezione:
while (len = recvfrom(s,buffer_ricezione , dimensione_buffer_ricezione, 0,(struct sockaddr*)&peeraddr_in, &addrlen)) {if (len == -1) printf("Si è verificato un errore di ricezione\n");while (len < dimensione_buffer_ricezione) {len1 = recvfrom(s, &buffer_ricezione[len], dimensione_buffer_ricezione - len, 0,(struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione\n");len += len1;}break;}
Il problema si presenta nel caso in cui si perde un pacchetto... In questo caso infatti la chiamata recvfrom() resta bloccata e il programma non procede.
Volevo sapere come è possibile impostare un timeout sulla recvfrom().
Qualcuno mi può aiutare?
Grazie 1000
P.S. non suggeritemi di utilizzare il TCP perchè per quello che devo fare è necessario usare l'UDP.
P.P.S.
Avevo pensato di poter interrompere la recvrom in questo modo:
......
double timeout=2; //timeout di 2 secondi
tstart(); //faccio partire un contatore
while ((len = recvfrom(s,buffer_ricezione , dimensione_buffer_ricezione, 0,(struct sockaddr*)&peeraddr_in, &addrlen))) {if (len == -1) printf("Si è verificato un errore di ricezione\n");while (len < dimensione_buffer_ricezione) {if(tval()>timeout) goto time_out_verificato; len1 = recvfrom(s, &buffer_ricezione[len], dimensione_buffer_ricezione - len, 0,(struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione\n");len += len1;}break;}
time_out_verificato:
.....
ma non ha funzionato.... evidentemente non rimane il blocco sul ciclo while, ma proprio sulla recvrom().... spero di essere stato chiaro...
Sto avendo un problema con i socket UDP.
Per inviare/ricever un buffer utilizzo le funzioni sendto(...) recvfrom(...).
Ad esempio, per l'invio:
if (sendto(s, buffer_invio, dimensione_buffer_invio, 0,(struct sockaddr*)&peeraddr_in, &addrlen) != 1) {fprintf(stderr, "Connection aborted on error"); exit(1);}
e per la ricezione:
while (len = recvfrom(s,buffer_ricezione , dimensione_buffer_ricezione, 0,(struct sockaddr*)&peeraddr_in, &addrlen)) {if (len == -1) printf("Si è verificato un errore di ricezione\n");while (len < dimensione_buffer_ricezione) {len1 = recvfrom(s, &buffer_ricezione[len], dimensione_buffer_ricezione - len, 0,(struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione\n");len += len1;}break;}
Il problema si presenta nel caso in cui si perde un pacchetto... In questo caso infatti la chiamata recvfrom() resta bloccata e il programma non procede.
Volevo sapere come è possibile impostare un timeout sulla recvfrom().
Qualcuno mi può aiutare?
Grazie 1000
P.S. non suggeritemi di utilizzare il TCP perchè per quello che devo fare è necessario usare l'UDP.
P.P.S.
Avevo pensato di poter interrompere la recvrom in questo modo:
......
double timeout=2; //timeout di 2 secondi
tstart(); //faccio partire un contatore
while ((len = recvfrom(s,buffer_ricezione , dimensione_buffer_ricezione, 0,(struct sockaddr*)&peeraddr_in, &addrlen))) {if (len == -1) printf("Si è verificato un errore di ricezione\n");while (len < dimensione_buffer_ricezione) {if(tval()>timeout) goto time_out_verificato; len1 = recvfrom(s, &buffer_ricezione[len], dimensione_buffer_ricezione - len, 0,(struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione\n");len += len1;}break;}
time_out_verificato:
.....
ma non ha funzionato.... evidentemente non rimane il blocco sul ciclo while, ma proprio sulla recvrom().... spero di essere stato chiaro...