【问题标题】:IPv6 Raw sockets. Cannot receive any packet on SIO_RCVALL socket. Win2008IPv6 原始套接字。无法在 SIO_RCVALL 套接字上接收任何数据包。 Win2008
【发布时间】:2012-06-19 11:32:05
【问题描述】:

我将 Windows Server 2008 R2 用于生产目的,因此使用原始套接字功能对我来说一定没有问题。但相反,我在入站 RCVALL 套接字上接收数据时遇到问题。我在做什么:

  1. m_recv_socket = socket( AF_INET6 , SOCK_RAW , IPPROTO_IPV6 ),
  2. setsockopt( m_recv_socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<const char*>( &recv_timeout_ms ), sizeof(int) );
  3. bind( m_recv_socket, reinterpret_cast<sockaddr *>( &sa ), sizeof( sa ) ); (我在这里将它绑定到我的网卡的 LINK-Local 地址,即 fe80::a077:5573:5f:3ca5)
  4. WSAIoctl( m_recv_socket, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL ); (其中 dwBufferInLen 等于 1)

当我尝试在此套接字上接收数据时,我不断收到 WSA_TIMEDOUT 并且没有收到任何数据。同时,Wireshark 证明此接口上存在入站和出站流量。怎么了?请问有什么帮助吗?为 IPv4 使用而修改的相同代码可以正常工作。上述调用的所有返回码都可以。

让我提供一些线索。存在类型(AF_INET6、SOCK_RAW、IPPROTO_IPV6)的未绑定发送套接字;正在设置 IPV6_HDRINCL。我通过它发送手动形成的 TCP 数据包。 Wireshark 证明它通过了。接下来,我看到传入的 TCP(RST, ACK) 与我绑定接收套接字的地址完全一致。但应用程序在数据接收试验时仍然被阻止。所有校验和都正常,否则不会有任何响应传入数据包。我确信这个传入的数据包是对我的 TCP(SYN) 请求的响应,因为 SEQ/ACK 数字证明了这一点(Wireshark 还向我显示了这个流的序列)。那么这个接收socket有什么问题呢?

【问题讨论】:

    标签: ipv6 windows-server-2008-r2 packet-sniffers raw-sockets traceroute


    【解决方案1】:

    根据the documentation

    在 Windows Server 2008 和更早版本上,SIO_RCVALL IOCTL 设置不会捕获从网络接口发送的本地数据包。这包括在另一个接口上接收并转发出为 SIO_RCVALL IOCTL 指定的网络接口的数据包。

    设置此 IOCTL 需要本地计算机上的管理员权限。

    这些都适用于你的情况吗?

    【讨论】:

    • 两者都不是...我想补充一点,Wireshark 证明有传入数据包到 fe80::a077:5573:5f:3ca5 地址,我将此套接字绑定到该地址。这些传入的数据包是我有兴趣捕获的。
    • 您能否显示设置您正在绑定的sockaddr 的代码?您能否用您正在编译的实际代码块更新您的问题?不要使用项目符号来显示单个语句。
    • sockaddr_in6 sa = {}; sa.sin6_family = AF_INET6; sa.sin6_addr = ip_addr; ip_addr 这里是一个in6_addr const & 变量。它设置为正确的地址(我在上面输入的那个)。代码比较大,贴在这里也没用。
    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    相关资源
    最近更新 更多