PDA

Visualizza la versione completa : [c] keep alive udp


stefanodf
15-02-2013, 12:21
Ciao a tutti, sto cercando di sviluppare un programmino in c di scambio file peer to peer, solo che ho problemi a implementare uno scambio di messaggi udp per vedere i peer che cadono. Vi posto un esempio della parte di codice in cui ho problemi, ho semplicemente un client e un server udp che si dovrebbero mandare messaggi però mi succede che quando vado a testare, il client non riceve risposte e si blocca sulla recvfrom mentre al server risulta che arrivano i messaggi da 127.0.0.1:6061(cioè da se stesso ??)


//server .c
int main(int argc, char** argv) {

printf("*Keep: Attivo\n");

int porta=6061 ;
printf("porta di ascolto keep %d \n", porta);
int sock;
struct sockaddr_in sock_keep, sock_out;
if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("Socket creation error");
exit(-1);
}

//fcntl(sock, F_SETFL,O_NONBLOCK );//setto la socket sd come non bloccante
memset((void *) &sock_keep, 0, sizeof (sock_keep));

sock_keep.sin_family = AF_INET; /* address type is INET */
if (inet_pton(AF_INET,"127.0.0.1", &sock_keep.sin_addr) <= 0) {//per testare sulla macchina locale

fprintf(stderr, "errore in inet_pton per %s", argv[1]);
exit(1);
}
sock_keep.sin_port = htons(porta);
//sock_keep.sin_addr.s_addr = htonl(INADDR_ANY);

char *ip=malloc(32*sizeof(char));

if (bind(sock, (struct sockaddr *) &sock_keep, sizeof (sock_keep)) < 0) {
perror("bind error");
exit(-1);
}
char* ip_keep = malloc(16*sizeof (char));

int end_line = 0;
int continua = 0;


porta = ntohs(sock_keep.sin_port);
while (continua == 0) {
printf("aspetto 9 secondi \n");
sleep(9);
ip=inet_ntoa(sock_keep.sin_addr);
printf("entro in ascolto su %s:%d \n", ip, porta);

//se fallisce il recv faccio come per il sendto
int len = 0; //lunghezza socket
end_line = recvfrom(sock, &ip_keep, sizeof (ip_keep), 0, (struct sockaddr *) &sock_keep, &len);
//perror("problema recvfrom keep \n");


ip = inet_ntoa(sock_keep.sin_addr);
porta = ntohs(sock_keep.sin_port);
printf("*Keep: Ricevuto segnale da %s:%d\n", ip, porta);

end_line = sendto(sock, NULL, 0, 0, (struct sockaddr *) &(sock_keep), sizeof ((sock_keep)));
if (end_line < 0) {
perror("errore in sendto keep \n");
} else {
printf("*Keep: Risposto al segnale\n");
}

}
end_line = 0;
}




//client.c
int main(int argc, char** argv) {

printf("thread keep alive attivato \n");

char ip_keep[10]; //serve a ricevere il messaggio di seccesso dal keep_alive
struct sockaddr_in keep_sock; // la recv_sock serve per riceevere le risposte del peer
int sock = socket(AF_INET, SOCK_DGRAM, 0);
int end_line;

int err;
while (1) {


printf("invio keep \n");

memset((void *) &keep_sock, 0, sizeof (keep_sock));
if (inet_pton(AF_INET, "127.0.0.1", &keep_sock.sin_addr) <= 0) {

fprintf(stderr, "errore in inet_pton per %s", argv[1]);
exit(1);
}

keep_sock.sin_port = htons(6061); //invierà segnali sulla porta 6060
char *ip = inet_ntoa(keep_sock.sin_addr);
sleep(3);
printf(" dopo 3 secondi mando serie di 3 keep a %s:%d \n", ip, ntohs(keep_sock.sin_port));

if ((end_line = sendto(sock, NULL, 0, 0, (struct sockaddr *) &keep_sock, sizeof (keep_sock))) < 0) {
perror("errore in sendto \n");
continue;
}
printf("aspetto 5 secondi e chiedo risposta \n ");


printf("chiedo risposta \n ");

if ((end_line = recvfrom(sock, &ip_keep, sizeof (ip_keep), MSG_PEEK, NULL, NULL)) < 0) {
//if ((end_line = recvfrom(*sd, NULL, 0,0,&ip_keep, sizeof(ip_keep))) < 0) {
perror("errore in recvfrom \n");

continue;
}
printf("ricevuta risposta \n");

}

printf("finito di mandare keep");


}

Loading