Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C P2P项目,使用UDP协议:当添加/删除新条目时,更新链接列表中的邻居列表_C_Udp_P2p - Fatal编程技术网

C P2P项目,使用UDP协议:当添加/删除新条目时,更新链接列表中的邻居列表

C P2P项目,使用UDP协议:当添加/删除新条目时,更新链接列表中的邻居列表,c,udp,p2p,C,Udp,P2p,我正在尝试使用UDP协议为P2P架构制作一个项目,其中包含一个主DS服务器。 我有一个链表,列表中的所有元素都有一个数组neigh[],其中存储两个相邻的元素,由它们的端口号标识。 当一个新的对等方加入或离开列表时,DS会将其新邻居发送给列表中的所有对等方。 邻居是列表中的上一个和下一个元素 查找邻居的函数 void find_neighbor(struct node_peer* head, int value, uint32_t* vector){ struct node_peer* poi

我正在尝试使用UDP协议为P2P架构制作一个项目,其中包含一个主DS服务器。 我有一个链表,列表中的所有元素都有一个数组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;  };
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)
当一个元素离开列表或被添加时,我向所有元素发送消息“AGG_NGH”,然后发送新的邻居(DS代码):

puntatore\u list=head;
strcpy(信息“AGG_NGH”);
len=strlen(messaggio)+1;
lmsg=htons(len);
while(puntatore_list&&puntatore_list->port!=0){
查找邻居(testa,puntatore\u列表->端口,neigh);
//根据avvisarlo dell'aggiornamento,内部对等信息
//戴索伊邻居
对等地址sin\u port=htons(puntatore\u列表->端口);
printf(“因维奥a%d\n”,puntatore\u列表->端口);
做{
ret=sendto(sd,(void*)和messaggio,len,0,(const struct sockaddr*)和peer_addr,sizeof(peer_addr));
}而(ret<0);
//信息维度的因维,以及未来的成功
//阿吉奥纳塔酒店
sprintf(消息,“%d%d”,neigh[0],neigh[1]);
printf(“Sto命令:%s\n”,消息);
len=strlen(messaggio)+1;
lmsg=htons(len);
做{
ret=sendto(sd,(void*)和lmsg,sizeof(uint32_t),0,(const struct sockaddr*)和peer_addr,sizeof(peer_addr));
}而(ret<0);
printf(“ret1:%d\n”,ret);
做{
ret=sendto(sd,(void*)和messaggio,len,0,(const struct sockaddr*)和peer_addr,sizeof(peer_addr));
}而(ret<0);
printf(“ret2:%d\n”,ret);
puntatore_列表=puntatore_列表->下一步;
}//罚款时间(puntatore_清单)
以及对等方接收消息和邻居的部分

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;  };
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)
else if(strcmp(缓冲区,“AGG_NGH”)==0){
printf(“AGGIORNO”);
//arrivo dal ds中的信息尺寸:
做{
ret=recvfrom(sd,(void*)和lmsg,BUF_大小,0,(struct sockaddr*)和ds_addr,以及ds_addrlen);
}而(ret<0);
printf(“ret1:%d\n”,ret);
len=ntohs(lmsg);
//里切沃·拉利斯塔·德·阿吉奥纳塔酒店
做{
ret=recvfrom(sd,(void*)缓冲区,len,0,(struct sockaddr*)和ds_addr,&ds_addrlen);
}而(ret<0);
printf(“ret2:%d\n”,ret);
sscanf(缓冲区,“%s%s”,vicino1,vicino2);
neigh[0]=atoi(vicino1);
neigh[1]=atoi(vicino2);
printf(“接收%d%d\n”,嘶鸣[0],嘶鸣[1]);
}//如果(AGG_NGH)罚款
但只有一些同龄人收到正确的邻居。 在DS端使用一些printf时,我注意到DS发送的是正确的值,但是一些对等方没有收到任何东西,甚至没有收到“AGG_NGH”