c - 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”。
解决方案
推荐阅读
- ssl - 提供默认证书时“无默认证书,生成一个”
- jsonschema - 当 if-else 存在时 JSON Schema 验证器的额外错误消息
- python - 如何使用 Boto3 搜索 S3 中的数千个对象,只知道部分键名(不是前缀)?
- capl - 有没有办法使用 capl 将诊断响应(UDS)从一条总线发送到另一条总线?
- qt - 获取 Linux 中可用的 WiFi 连接列表
- c# - 是否可以实现异步套接字服务器但在命令上接收消息
- php - 尝试在 Heroku 上安装 ext-gd 内存不足
- python - 为什么这个基本的 PyQt5 程序不起作用?
- javascript - 如何初始化动态插入的数据组以引导
- api - 如何使用 Odoo API(XMLRPC) 使用一个 2many、many2one 和 many2many 字段设置相关字段?