【问题标题】:ICMPv6 - Cannot read any router advertisement messagesICMPv6 - 无法读取任何路由器通告消息
【发布时间】:2011-10-24 10:29:54
【问题描述】:

我正在尝试使用原始套接字和 ICMPv6 来读取 Windows 上的路由器广告消息。通过 Wireshark,我可以看到路由器(Cisco 877)大约每 200 秒发送一次这些消息,但我的应用程序从未收到它们。

我的代码采取以下步骤:

1) 使用 ICMPv6 协议创建 IPv6 原始套接字

2) 将套接字绑定到 IPv6 未指定地址 (::)

3) 在 FF02::1 加入链路本地所有节点多播组

4) 接收路由器广告(...或不:))

如果我加入 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 ();
}

【问题讨论】:

    标签: c++ sockets winsock ipv6 multicast


    【解决方案1】:

    它适用于FF02::16,因为这是 Cisco 用于广播的内容。有关详细信息,请参阅 Cisco 论坛上的讨论:

    IPv6 address FF02::16 Significance

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 2011-01-12
      • 2023-03-07
      相关资源
      最近更新 更多