Windowsでルーター通知メッセージを読み取るのにRAWソケットとICMPv6を使用しようとしています。 Wiresharkを通して、私はルータ(Cisco 877)が約200秒ごとにこれらのメッセージを送信するのを見ることができますが、私のアプリケーションはそれを受信しません。ICMPv6 - ルーター通知メッセージを読み取ることができません
1)IPv6の生のソケットを作成するのICMPv6プロトコル
2を使用)は、IPv6未指定アドレス(のソケットバインド::)
3)参加
私のコードは、以下のステップを取りFF02 :: 1
4)でリンクローカルのすべてのノードのマルチキャストグループは
コードはFiを提供して働くルータ広告(...かどうかを:))受信しますもし私がFF02 :: 16に参加すれば...
私はホップ限界、マルチキャストホップのような他のソケットオプションを無駄に設定しようとしました。私がそれらの外にいるので、どんな考えも歓迎されるでしょう。
#include "stdlib.h"
#include "winsock2.h"
#include "Ws2tcpip.h"
#pragma comment(lib, "ws2_32.lib")
void
main (int argc,char **argv)
{
WSADATA wsaData;
SOCKET nSocket;
struct sockaddr_in6 sockinfo;
struct ipv6_mreq mreq;
char strBuffer[1024];
int nBytes;
WSAStartup (MAKEWORD (2,2),&wsaData);
// Create a raw socket talking ICMPv6
if ((nSocket = socket (AF_INET6,SOCK_RAW,IPPROTO_ICMPV6)) == SOCKET_ERROR)
return;
// Bind to ::
::memset (&sockinfo,0,sizeof (sockinfo));
sockinfo.sin6_family = AF_INET6;
inet_pton (AF_INET6,"::",&sockinfo.sin6_addr);
if (bind (nSocket,(struct sockaddr *) &sockinfo,sizeof (sockinfo)) < 0)
return;
// Join the link-local all nodes multicast group
inet_pton (AF_INET6,"FF02::1",&mreq.ipv6mr_multiaddr);
mreq.ipv6mr_interface = 0;
if (setsockopt (nSocket,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,(char *) &mreq,sizeof (mreq)) < 0)
return;
// Wait for advertisements
for (;;)
nBytes = ::recvfrom (nSocket,strBuffer,sizeof (strBuffer),0,NULL,0);
closesocket (nSocket);
WSACleanup();
}