Windows 8 无法捕获Windows 8的IPv6多播流量
以下是我编写的用于捕获来自多播地址ff02::1和端口9154的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";
此代码在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显示了流量,但我的应用程序无法捕获它。