0

我将 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 还向我显示了这个流的序列)。那么这个接收套接字可以做错什么呢?

4

1 回答 1

0

根据文档

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

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

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

于 2012-06-19T18:30:22.050 回答