x-t
02-07-2007, 15:49
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:
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++;
}
LATO SERVER:
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++;
}
Fino a quando contatore non raggiunge iterazioni, l'applicazione dovrebbe restare dentro il ciclo, e stampare, sia dal lato client che dal lato server, il punto in cui qualcosa non ha funzionato.
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!
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:
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++;
}
LATO SERVER:
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++;
}
Fino a quando contatore non raggiunge iterazioni, l'applicazione dovrebbe restare dentro il ciclo, e stampare, sia dal lato client che dal lato server, il punto in cui qualcosa non ha funzionato.
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!