|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2006
Messaggi: 207
|
[c] socket UDP, timeout con select()....Aiutooo!
Salve a tutti!
Una settimana fa avevo aperto una discussione simile, ma non ho risolto il probema, e siccome la discussione è invecchiata troppo ho pensato di farne un'altra. Il problema non è cambiato: si tratta di far in modo che una recvfrom(...) non resti bloccata se un pacchetto viene perduto (tendo conto che ho l'assoluta necessità di utilizzare l'UDP e che lavoro in windows). Mi era stato suggerito di usare la funzione select(). Vi posto 2 pezzi di codice relativ al client e al server: LATO CLIENT: Codice:
while(contatore<iterazioni){ if (sendto(s, buffer_invio, dim_buff, 0, (struct sockaddr*)&peeraddr_in, &addrlen) != dim_buff) {fprintf(stderr, "Connection aborted on error"); exit(1);} //invia al server il buffer fd_set readfds, masterfds; struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; memcpy(&readfds, &masterfds, sizeof(fd_set)); if (select(s+1, &readfds, NULL, NULL, &timeout) < 0){ perror("on select"); exit(1); } if (FD_ISSET(s, &readfds)){ while (len = recvfrom(s,buffer_ricezione , dim_buff, 0, (struct sockaddr*)&peeraddr_in, &addrlen)) {if (len == -1) printf("Si è verificato un errore di ricezione\n");while (len < dim_buff) {len1 = recvfrom(s, &buffer_ricezione[len], dim_buff - len, 0, (struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione\n");len += len1;}break;} //ricezione dal server printf("1\t"); } else { printf("0\t"); contapersi++; // the socket timedout } contatore++; } Codice:
while(contatore<iterazioni){ fd_set readfds, masterfds; struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; FD_ZERO(&masterfds); FD_SET(s, &masterfds); memcpy(&readfds, &masterfds, sizeof(fd_set)); if (select(s+1, &readfds, NULL, NULL, &timeout) < 0){ perror("on select"); exit(1); } if (FD_ISSET(s, &readfds)) { while ((len = recvfrom(s,buffer_invio_ricezione , dim_buff, 0,(struct sockaddr*)&peeraddr_in, &addrlen))) {if (len == -1) printf("Si è verificato un errore di ricezione per %d\n", contatore+1); while (len < dim_buff) {len1 = recvfrom(s, &buffer_invio_ricezione[len], dim_buff - len, 0,(struct sockaddr*)&peeraddr_in, &addrlen);if (len1 == -1) printf("Si è verificato un errore di ricezione per %d\n", contatore+1);len += len1;}break;} //ricezione dal client printf("ok su %d\n", contatore + 1); } else { // the socket timedout printf("timeout su %d\n", contatore + 1); } if (sendto(s, buffer_invio_ricezione, dim_buff, 0,(struct sockaddr*)&peeraddr_in, &addrlen) != dim_buff) {fprintf(stderr, "Connection aborted on error"); exit(1);} //invia al client il buffer ricevuto contatore++; } Praticamente, riesce solo a ricevere il primo pacchetto, dopo di che esce a causa di un errore da parte della select (infatti torna -1). Io non sto capendo proprio dove possa essere il problema. Vi prego, qualcuno di buona volontà mi può aiutare? grazie infinite! Ultima modifica di x-t : 02-07-2007 alle 15:51. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:44.