我将 Windows Server 2008 R2 用于生产目的,因此使用原始套接字功能对我来说一定没有问题。但相反,我在入站 RCVALL 套接字上接收数据时遇到问题。我在做什么:
m_recv_socket = socket( AF_INET6 , SOCK_RAW , IPPROTO_IPV6 ),
setsockopt( m_recv_socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<const char*>( &recv_timeout_ms ), sizeof(int) );
bind( m_recv_socket, reinterpret_cast<sockaddr *>( &sa ), sizeof( sa ) );
(我在这里将它绑定到我的网卡的 LINK-Local 地址,即 fe80::a077:5573:5f:3ca5)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 还向我显示了这个流的序列)。那么这个接收套接字可以做错什么呢?