首页 > 解决方案 > P2P 项目,使用 UDP 协议:在添加/删除新条目时更新链表中的邻居列表

问题描述

我正在尝试使用 UDP 协议为具有主 DS 服务器的 P2P 架构创建一个项目。我有一个链表,链表的所有元素都有一个数组 neigh[],在其中记住两个邻居,由它们的端口号标识。当一个新的对等体加入或离开列表时,DS 向列表中的所有对等体发送它们的新邻居。邻居是列表中的前一个元素和下一个元素。

寻找邻居的功能

void find_neighbor(struct node_peer* head, int value, uint32_t* vector){

struct node_peer* pointer;
struct node_peer* pointer_down;
struct node_peer* pointer_up;
pointer = head;
pointer_down = NULL;
pointer_up = NULL;
        
if(pointer->next)
    pointer_up = pointer->next;

while(pointer->port != value){
    
    if(pointer_up->next){
        pointer_down = pointer;
        pointer = pointer_up;
        pointer_up = pointer_up->next;
    }
    
    else {
        pointer_down = pointer;
        pointer = pointer_up;
        pointer_up = NULL;
    }
}

if(!pointer_down) vector[0] = 0;
else vector[0] = pointer_down->port;

if(!pointer_up) vector[1] = 0;
else vector[1] = pointer_up->port;  };

当一个元素离开列表或被添加时,我向所有元素发送消息“AGG_NGH”,然后,我发送新邻居(DS CODE):

puntatore_list = head;

            strcpy(messaggio, "AGG_NGH");
            len = strlen(messaggio)+1;
            lmsg = htons(len);


            while(puntatore_list && puntatore_list->port != 0){
                
                find_neighbor(testa, puntatore_list->port, neigh);
                    
                //invio al peer un messaggio, per avvisarlo dell'aggiornamento 
                //dei suoi neighbors

                peer_addr.sin_port = htons(puntatore_list->port);
                printf("Invio a %d\n", puntatore_list->port);

                do {    
                    ret = sendto(sd,(void*)&messaggio, len, 0, (const struct sockaddr*)&peer_addr, sizeof(peer_addr));
                } while(ret < 0);
                

                //invio poi la dimensione del messaggio, e successivamente la lista dei
                //neighbors aggiornata

                sprintf(messaggio, "%d %d", neigh[0], neigh[1]);
                printf("Sto mandando: %s\n", messaggio);
                len = strlen(messaggio)+1;
                lmsg = htons(len);

                do {    
                    ret = sendto(sd, (void*)&lmsg, sizeof(uint32_t), 0, (const struct sockaddr*) &peer_addr, sizeof(peer_addr));
                } while(ret < 0);
                printf("ret1:%d\n", ret);                   

                do {    
                    ret = sendto(sd,(void*)&messaggio, len, 0, (const struct sockaddr*) &peer_addr, sizeof(peer_addr));
                } while(ret < 0);
                printf("ret2:%d\n", ret);

                puntatore_list = puntatore_list->next;

            }//fine while(puntatore_list)

以及对等方和邻居收到消息的部分

else if(strcmp(buffer, "AGG_NGH") == 0){
            printf("AGGIORNO\n");
            //ricevo le dimensioni del messaggio in arrivo dal ds:

            do {
                ret = recvfrom(sd, (void*)&lmsg, BUF_SIZE, 0 ,(struct sockaddr*) &ds_addr, &ds_addrlen);        
            } while(ret < 0 );
            printf("ret1:%d\n", ret);
            
            len = ntohs(lmsg);  

            //ricevo la lista dei neighbors aggiornata
            do {        
                ret = recvfrom(sd, (void*)buffer, len, 0 ,(struct sockaddr*) &ds_addr, &ds_addrlen);                
            } while(ret < 0 );

            printf("ret2:%d\n", ret);

            sscanf(buffer,"%s %s", vicino1, vicino2);
            neigh[0] = atoi(vicino1);
            neigh[1] = atoi(vicino2);
            printf("Recive %d %d\n", neigh[0], neigh[1]);

        }//fine if(AGG_NGH)

但只有一些对等方接收到正确的邻居。在 DS 端使用一些 printf,我注意到 DS 发送了正确的值,但有些对等方没有收到任何内容,甚至没有收到“AGG_NGH”。

标签: cudpp2p

解决方案


推荐阅读