Ragazzi stavo facendo un semplice client in c che deve attendere in ingresso un pacchetto udp per al massimo 60 secondi. Se il timeout scade la funzione torna la stringa nulla, altrimenti essa ritornera’ la notazione stringa relativa al numero IP della sorgente del pacchetto.
La domanda è semplice, non so in che punto del codice posizionare questa roba:
gestione_timeout è una funzione separata che DOVREBBE essere così:codice:alarm(60000); signal(SIGALRM, gestione_timeout);
Edit: è un pacchetto udp, non devo fare la listen ma direttamente recvfrom..codice:char* gestione_timeout() { signal(SIGALRM, gestione_timeout); alarm(60000); return .. oddio come si ritorna la stringa vuota? XD }
La chiamata a gestione_timeout() va dopo la creazione del socket? Dopo il bind? Listen? Accept? XD
Grazie
Metto il codice (una bozza):
codice:#DEFINE SIZE 100 int T; char *funzione(short PN) { int sock, bind, recv; struct sockaddr_in my_addr; struct sockaddr_in remote_addr; if(sock = socket(AF_INET, SOCK_DGRAM, 0) == -1) { //gestisco errore } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(PN); my_addr.sin_addr.h_addr = htonl(INADDR_ANY); if(bind = bind(sock, (sockaddr*)&my_addr,sizeof(my_addr)) == -1) { //gestisco errore } char* messaggio = (char*)malloc(SIZE); memset(messaggio,0,100); T = 0; signal(SIGALRM, gestione_timeout); alarm(60000); if(recv = recvfrom(sock,messaggio,SIZE,0,(struct sockaddr*)&remote_addr, sizeof(remote_addr)) == -1) { if(errno == EINTR) { if(T) { printf("TIMEOUT"); exit(1); } else { printf("Altro segnale diverso da sigalrm"); exit(1); } } else { printf("recvfrom fallisce per altri motivi"); exit(1); } } if(T == 0) return inet_ntoa(remote_addr.sin_addr); else return null; } void gestione_segnale() { T = 1; return null; }


Rispondi quotando