2013-09-28 25 views
0

我通過網絡通過組播傳輸數據。
我正在將數據發送到PC和我的主板,它運行freeRTOS和Lwip。數據在PC上正確接收,但不在我的主板上。
板上的代碼是PC中代碼的精確相關副本。
我已經嘗試了各種解決方案,涉及設置NETIF_FLAG_IGMP標誌,使用netconn_join_leave_group而不是igmp_leave或igmp_join,但都有他們似乎無法正常工作。
上述兩個解決方案是我最好的選擇,但他們失敗了。 我試圖找出解決這個問題的方法三天,但無濟於事。組播UDP在我的電路板上不工作

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

您是否將電路板的以太網控制器配置爲接受多播數據包? lwIP有一個函數netif_set_igmp_mac_filter(),您可以使用它來註冊每次加入或離開多播組時都會調用的回調函數。在執行回調時,您可能需要將您的以太網控制器配置爲接受您加入的組的組播MAC地址。