|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2006
Messaggi: 207
|
[c] socket UDP, timeout....AIUTO!
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... Ultima modifica di x-t : 24-06-2007 alle 16:16. |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Su win32, una la select seguita dalla normale recvfrom.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Apr 2007
Messaggi: 54
|
AIUTOOOOOOOOOO!!!!
Sto impazzendo anch'io con i socket udp!!!!! Non riesco a impostare il timeout!!!! e su internet nn esistono esempi!!!
Come si usa la select () su windows?? VI PREGO AIUTO! ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Apr 2007
Messaggi: 54
|
Oh potenete ilsensine...
Io nn sto trovando un pezzo di codice semi decente in cui è spiegato come utilizzare select() prima della recvfrom()... Ti prego aiutami, attendo fonte d'illuminazione...(un pò di codice pulito) ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Completamente non testato, ma ti rende l'idea...
Codice:
SOCKET sock = <il tuo socket>; fd_set ifds; long timeout_usec = 1000000; // il tuo timeout, in us struct timeval timeout; int ret; assert(sock<FD_SETSIZE); // Definisci una tua FD_SETSIZE se capita questo FD_ZERO(&ifds); FD_SET(sock, &ifds); timeout.tv_sec = timeout_usec / 1000000; timeout.tv_usec = timeout_usec % 1000000; ret = select(sock+1, &ifds, NULL, NULL, &timeout); if (ret<=0 || !FD_ISSET(sock, &ifds)) { /* timeout o errore */ } else { /* Dati in ingresso al socket; puoi qui usare la recvfrom senza bloccare */ }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Apr 2007
Messaggi: 54
|
AIUTOOOOOOOOOOOOOOOOOOOOOOOOOOO!!!!!!!!!!!!!!
Grazie per la risposta.. ma ancora nn ci siamo.
1. Intanto ho dovuto togliere assert(sock<FD_SETSIZE); perchè altrimenti nn compilava (è grave?) 2. if (ret<=0 || !FD_ISSET(sock, &ifds)) { /* timeout o errore */ } else { /* Dati in ingresso al socket; puoi qui usare la recvfrom senza bloccare */ } nn è che forse è al contrario?? ovvero: if (ret<=0 || !FD_ISSET(sock, &ifds)) { /* Dati in ingresso al socket; puoi qui usare la recvfrom senza bloccare */ } else { /* timeout o errore */ } io credo di si. 3.si blocca in ogni caso... non funziona.. ![]() ![]() TI PREGO AIUTAMI! |
![]() |
![]() |
![]() |
#8 | ||
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
metti qualcosa tipo #define FD_SETSIZE 16384 all'inizio del file, prima di tutti gli include. Non sono sicuro che windows onora FD_SETSIZE, ma lo standard posix lo richiede. Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ah no scusa, avevo letto male. E' un errore di compilazione, devi includere <assert.h>
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:32.