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 ??)
codice://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; }codice://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"); }

 
			
			 
					
					
					
						 Rispondi quotando
  Rispondi quotando