Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows IPv6原始套接字-为什么不';我看不到收到的包吗? 我在Windows上编写了一个C++程序,它创建一个原始套接字,将它绑定到一个IPv6接口,并尝试刷新IPv6数据包。出于某种原因,recv()不会返回任何数据包,尽管我确信在接口上收到了IPv6数据包(我使用Wireshark进行了验证)。 有什么问题吗_C++_Windows_Ipv6_Raw Sockets - Fatal编程技术网

Windows IPv6原始套接字-为什么不';我看不到收到的包吗? 我在Windows上编写了一个C++程序,它创建一个原始套接字,将它绑定到一个IPv6接口,并尝试刷新IPv6数据包。出于某种原因,recv()不会返回任何数据包,尽管我确信在接口上收到了IPv6数据包(我使用Wireshark进行了验证)。 有什么问题吗

Windows IPv6原始套接字-为什么不';我看不到收到的包吗? 我在Windows上编写了一个C++程序,它创建一个原始套接字,将它绑定到一个IPv6接口,并尝试刷新IPv6数据包。出于某种原因,recv()不会返回任何数据包,尽管我确信在接口上收到了IPv6数据包(我使用Wireshark进行了验证)。 有什么问题吗,c++,windows,ipv6,raw-sockets,C++,Windows,Ipv6,Raw Sockets,以下是我编写的代码: #include <stdio.h> #include <winsock2.h> #include <ws2tcpip.h> #include <string> #include "IpUtils.h" #define SIO_RCVALL 0x98000001 #define RAW_SOCKET_BUFFER_LEN 65536 int main() { int timeout = 10; // 10 sec

以下是我编写的代码:

#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string>
#include "IpUtils.h"

#define SIO_RCVALL  0x98000001
#define RAW_SOCKET_BUFFER_LEN 65536

int main()
{
    int timeout = 10; // 10 seconds
    std::string ipv6Addr = "my IPv6 address...";
    int numOfPackets = 1; // try to read just one packet

    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);

    SOCKET fd = socket(AF_INET6, SOCK_RAW, IPPROTO_IPV6);
    if (fd < 0)
    {
        printf("error in socket creation\n");
        return 1;
    }
    else
        printf("socket creation succeeded\n");

    struct sockaddr_in6 localAddrIPv6;
    localAddrIPv6.sin6_family = AF_INET6;
    inet_pton(AF_INET6, ipv6Addr.c_str(), &localAddrIPv6.sin6_addr.s6_addr);
    localAddrIPv6.sin6_port = 0; // Any local port will do
    localAddrIPv6.sin6_scope_id = 0;

    if (bind(fd, (struct sockaddr *)&localAddrIPv6, sizeof(localAddrIPv6)) < 0)
    {
        printf("error in bind, error code was %d\n", WSAGetLastError());
        closesocket(fd);
        return 1;
    }
    else
        printf("bind succeeded\n");

    int n = 1;
    DWORD dwBytesRet;
    if (WSAIoctl(fd, SIO_RCVALL, &n, sizeof(n), NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR)
    {
        printf("Call to WSAIotcl(%ul) failed with error code %d\n", SIO_RCVALL, WSAGetLastError());
        closesocket(fd);
        return 1;
    }
    else
        printf("call to WSAIotcl succeeded\n");

    DWORD timeoutVal = timeout * 1000;
    setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeoutVal, sizeof(timeoutVal));

    for (int i = 0; i < numOfPackets; i++)
    {
        char* buffer = new char[RAW_SOCKET_BUFFER_LEN];
        memset(buffer, 0, RAW_SOCKET_BUFFER_LEN);

        printf("start recv for packet #%d\n", i);
        int bufferLen = recv(fd, buffer, RAW_SOCKET_BUFFER_LEN, 0);
        if (bufferLen < 0)
        {
            printf("recv failed with an error code %d\n", WSAGetLastError());
            closesocket(fd);
            delete [] buffer;
            return 1;
        }
        else
        {
            printf("Got a packet with len %d\n", bufferLen);
        }

        delete [] buffer;
    }

    return 0;
}
运行程序后得到的输出是:

socket creation succeeded
bind succeeded
call to WSAIotcl succeeded
start recv for packet #0
recv failed with an error code 10060 <== WSAETIMEDOUT which means timeout expired
套接字创建成功
绑定成功
调用WSAIotcl成功
为数据包#0启动recv

recv失败,错误代码为10060,至少出现在
套接字中的
IPPROTO\u IPV6
(AF\u INET6,SOCK\u RAW,IPPROTO\u IPV6)
表示您将只接收本身携带IPv6数据包的IPv6数据包(即,该参数是IPv6数据包内协议字段的筛选器)。因此,请尝试接收携带UDP或TCP或ICMPv6的IPv6数据包。我看不出有任何方式可以说您想要接收任何类型的IPv6数据包。谢谢!如果我想接收任何IPv6数据包(UDP、TCP、ICMPv6等),我应该使用什么协议?如前所述,我在文档中没有看到任何方法可以做到这一点。如果您正在构建某种嗅探器,请考虑改用winpcap库。当我将
IPPROTO_IPV6
替换为
IPPROTO_IPV6
时,确实会看到流量到达套接字,但不幸的是,它不包括IPV6头。我尝试设置
IP\u HDRINCL
socket选项:
int on=1;设置锁定选项(fd、IPPROTO_IP、IP_HDRINCL和on、sizeof(on))
并设置
IPV6\u HDRINCL
int on=1;setsockopt(fd、IPPROTO_IPV6、IPV6_HDRINCL和on、sizeof(on))但它们都没有帮助。有什么想法吗?@fx23
IP_HDRINCL
IPV6_HDRINCL
用于发送的传出数据包,而不是读取的传入数据包,特别地:“对于IPv4…,应用程序在每个接收到的数据报前面接收IP报头,而不考虑
IP_HDRINCL
socket选项。对于IPv6…,应用程序将在每个接收到的数据报的最后一个IPv6报头之后接收所有内容,而不考虑“IPv6_HDRINC”套接字选项。应用程序未使用原始套接字接收任何IPv6标头。
socket creation succeeded
bind succeeded
call to WSAIotcl succeeded
start recv for packet #0
recv failed with an error code 10060 <== WSAETIMEDOUT which means timeout expired