2011-10-24 8 views
1

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(); 
} 

答えて

1

それはシスコがその放送のために使用するものであるため、それはFF02::16上で動作します。詳細については、シスコのフォーラムのディスカッションを参照してください。

IPv6 address FF02::16 Significance

関連する問題