我通过我的网络通过多播传输数据
我将数据发送到PC和我的主板上运行freeRTOS和Lwip。数据直接在PC上接收但不在我的主板上。
电路板中的代码是PC中代码的完全相关副本
我尝试了各种解决方案,包括设置NETIF_FLAG_IGMP标志,使用netconn_join_leave_group而不是igmp_leave或igmp_join,但两者似乎都没有工作。
上面两个解决方案是我最好的赌注,但他们让我失望了。
我试图找到解决这个问题的方法三天,但无济于事。
int recieve_udp(char *ip, int sock, int port)
{
int datalen;
char databuf[25];
struct ip_mreq group;/*Multicast address group structure*/
struct sockaddr_in localSock;
{
int reuse=1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
(char *)&reuse, sizeof(reuse)) < 0)
{
wmprintf("setting SO_REUSEADDR");
net_close(sock);
return -1;
}
}
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(EXAMPLE_PORT);
localSock.sin_addr.s_addr = htonl(INADDR_ANY);
if (net_bind(sock, (struct sockaddr*)&localSock, sizeof(localSock)))
{
wmprintf("\r\nbinding datagram socket");
net_close(sock);
return 2;
}
group.imr_multiaddr.s_addr = inet_addr(SRV_IP);
//group.imr_interface.s_addr = inet_addr("192.168.0.116");
group.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char *)&group, sizeof(group)) < 0)
{
wmprintf("\r\nadding multicast group");
net_close(sock);
return -3;
}
datalen = sizeof(databuf);
while(1){
if (read(sock, databuf, datalen) < 0)
{
wmprintf("\r\nreading datagram message");
net_close(sock);
return -4;
}
else
wmprintf("The data recieved is %s\r\n",databuf);
}
return 0;
}
答案 0 :(得分:0)
您是否将电路板的以太网控制器配置为接受多播数据包? lwIP有一个函数netif_set_igmp_mac_filter(),您可以使用它来注册每次加入或离开多播组时将调用的回调。在回调的实现中,您可能需要将以太网控制器配置为接受要加入的组的多播MAC地址。