0

我正在使用Windows Server 2008 R2进行生产,所以使用原始套接字功能对我来说一定没有问题。但是相反,我在接收入站RCVALL套接字时遇到问题。我在做什么:IPv6原始套接字。无法接收SIO_RCVALL套接字上的任何数据包。 Win2008

  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)); (我在这里结合它在我的网卡的链路本地地址,即FE80 :: A077:5573:5F:3ca5)
  4. WSAIoctl(m_recv_socket, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned , NULL , NULL); (凡dwBufferInLen等于1)

当我尝试recv这个套接字上的数据时,我经常收到WSA_TIMEDOUT并没有收到任何数据。与此同时,Wireshark证明此接口上存在入站和出站流量。哪里不对?请帮忙吗?为IPv4使用而修改的相同代码正常工作。上述呼叫的所有返回码都可以。

让我给一些线索。存在类型为(AF_INET6,SOCK_RAW,IPPROTO_IPV6)的未绑定发送套接字;正在设置IPV6_HDRINCL。我通过它发送手动形成的TCP数据包。 Wireshark证明它通过很好。接下来,我看到传入的TCP(RST,ACK)正好与我绑定接收套接字的地址相关。但应用程序在数据接收试用期间仍然受阻所有校验和都可以,否则不会有任何响应传入数据包。我确信这个传入数据包是对我的TCP(SYN)请求的响应,因为SEQ/ACK数字证明了这一点(Wireshark也显示了这个数据流的序列)。那么这个接收套接字可以做些什么呢?

回答

0

根据the documentation

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

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

其中之一适用于您的情况吗?

+0

他们都不是......我想补充一点,Wireshark证明有传入数据包到fe80 :: a077:5573:5f:3ca5地址,我将它绑定到这个地址。这些传入的数据包是一些,我有兴趣捕获。 – Zorgiev

+0

你能不能展示设置你绑定的'sockaddr'的代码?你能否用你正在编译的实际代码块更新你的问题?不要使用项目符号来显示个别语句。 –

+0

'sockaddr_in6 sa = {}; \t sa.sin6_family \t = AF_INET6; \t sa.sin6_addr \t = ip_addr; 'ip_addr这里是一个'in6_addr const&'变量。它被设置为一个正确的地址(我在上面输入的那个)。代码很大,所以在这里粘贴是没有用的。 – Zorgiev