我正在使用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 ) );
(我在这里将它绑定到我的nic的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也向我展示了这个流的序列)。那么这个接收套接字有什么问题呢?
答案 0 :(得分:0)
在Windows Server 2008及更早版本中,SIO_RCVALL IOCTL设置不会捕获从网络接口发出的本地数据包。这包括在另一个接口上接收的数据包,并转发出为SIO_RCVALL IOCTL指定的网络接口。
设置此IOCTL需要本地计算机上的管理员权限。
这些适用于您的情况吗?