C P2P项目,使用UDP协议:当添加/删除新条目时,更新链接列表中的邻居列表
我正在尝试使用UDP协议为P2P架构制作一个项目,其中包含一个主DS服务器。 我有一个链表,列表中的所有元素都有一个数组neigh[],其中存储两个相邻的元素,由它们的端口号标识。 当一个新的对等方加入或离开列表时,DS会将其新邻居发送给列表中的所有对等方。 邻居是列表中的上一个和下一个元素 查找邻居的函数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
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”