Windows 8 无法捕获Windows 8的IPv6多播流量

Windows 8 无法捕获Windows 8的IPv6多播流量,windows-8,ipv6,multicast,winsock2,multicastsocket,Windows 8,Ipv6,Multicast,Winsock2,Multicastsocket,以下是我编写的用于捕获来自多播地址ff02::1和端口9154的IPv6多播数据的函数。 此代码在Windows Vista和Windows 7上运行良好。但是我无法为Windows 8捕获相同的通信量(没有一个winsock函数返回Win8的错误)。 使用netstat我可以验证我的应用程序是否正在使用此端口。 有人能帮忙吗 void func() { int multicastChannel = 0; char multicastIP[] = "FF02::1";

以下是我编写的用于捕获来自多播地址ff02::1和端口9154的IPv6多播数据的函数。
此代码在Windows Vista和Windows 7上运行良好。但是我无法为Windows 8捕获相同的通信量(没有一个
winsock
函数返回Win8的错误)。

使用
netstat
我可以验证我的应用程序是否正在使用此端口。
有人能帮忙吗

void func()
{

    int multicastChannel = 0;
    char multicastIP[] = "FF02::1";
    char multicastPort[] = "9154";

    ADDRINFO*  multicastAddr  = NULL;
    ADDRINFO*  localAddr      = NULL;
    ADDRINFO   hints          = { 0 };

    struct ipv6_mreq multicastRequest6;

    hints.ai_family = PF_UNSPEC;
    hints.ai_flags  = AI_NUMERICHOST;

    if ( getaddrinfo(multicastIP, NULL, &hints, &multicastAddr) != 0 )
    {
        printf("getaddrinfo() failed");
        return;
    }

    hints.ai_family   = multicastAddr->ai_family;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_flags    = AI_PASSIVE;

    if ( getaddrinfo(NULL, multicastPort, &hints, &localAddr) != 0 )
    {
        printf("getaddrinfo() failed");
        return;
    }

    multicastChannel = socket(localAddr->ai_family, localAddr->ai_socktype, 0);

    if ( bind(multicastChannel, localAddr->ai_addr, localAddr->ai_addrlen) != 0 )
    {
        printf("bind() failed");
        return;
    }

    memcpy(&multicastRequest6.ipv6mr_multiaddr,
           &((struct sockaddr_in6*)(multicastAddr->ai_addr))->sin6_addr,
           sizeof(multicastRequest6.ipv6mr_multiaddr));

    multicastRequest6.ipv6mr_interface = 0;

    if ( setsockopt(multicastChannel,
                    IPPROTO_IPV6,
                    IPV6_ADD_MEMBERSHIP,
                    (char*) &multicastRequest6,
                    sizeof(multicastRequest6)) != 0 )
    {
        ERROR_ReportError("setsockopt() failed");
    }

    freeaddrinfo(localAddr);
    freeaddrinfo(multicastAddr);

    ioctlsocket(multicastChannel, FIONBIO, &arg);

    sockaddr_in6 fromAddr;

    while(1)
    {
        read = recvfrom(multicastChannel,
                data,
                1500,
                0,
                (struct sockaddr*)&fromAddr,
                &sizeof(sockaddr_in6);

        if (read > 0) {
            function();
        }
    }
}

打印出所有返回的值。这可能是因为默认的多播路由不正确:您显式设置了0。由于地址FF02::1上的多播类似于IPv6网络上的广播,wireshark显示了流量,但我的应用程序无法捕获它。