0

ネットワークを介してマルチキャストでデータを送信しています。
PC と、freeRTOS と Lwip を実行するボードにデータを送信しています。データは PC で受信されますが、ボードでは受信されません。
ボード内のコードは、PC 内のコードに正確に関連するコピーです。
igmp_leave または igmp_join の代わりに netconn_join_leave_group を使用して、NETIF_FLAG_IGMP フラグを設定することを含むさまざまな解決策を試しましたが、どちらも機能していないようです。
上記の 2 つの解決策は私の最善の策でしたが、失敗しました。私はこれを回避する方法を3日間見つけようとしていますが、役に立ちません。

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;

}
4

1 に答える 1

0

マルチキャスト パケットを受け入れるようにボードのイーサネット コントローラを設定していますか? lwIP には関数 netif_set_igmp_mac_filter() があり、マルチキャスト グループに参加または脱退するたびに呼び出されるコールバックを登録するために使用できます。コールバックの実装では、参加するグループのマルチキャスト MAC アドレスを受け入れるようにイーサネット コントローラを構成する必要がある場合があります。

于 2014-02-27T15:23:17.293 に答える