PDA

Visualizza la versione completa : [C]Gestire SIGALRM


Javino89
31-03-2012, 16:22
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:


alarm(60000);
signal(SIGALRM, gestione_timeout);


gestione_timeout è una funzione separata che DOVREBBE essere così:


char* gestione_timeout() {
signal(SIGALRM, gestione_timeout);
alarm(60000);
return .. oddio come si ritorna la stringa vuota? XD
}


Edit: è un pacchetto udp, non devo fare la listen ma direttamente recvfrom..
La chiamata a gestione_timeout() va dopo la creazione del socket? Dopo il bind? Listen? Accept? XD

Grazie :)

Metto il codice (una bozza):



#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;
}

Loading