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");

    
}