在我的公司,我们开发了一个网络产品,它就像一个嗅探器。
为了捕获所有 IPV4 数据包,我们遵循下一个过程:
new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Udp);
socket.Bind(new IPEndPoint(address, 0));
)socket.IOControl(IOControlCode.ReceiveAll, new byte[]{ 1, 0, 0, 0 }, null);
这就是我们从网络接口(interface)捕获所有 IPV4 数据包所需的一切。其余的是循环内的简单读取操作。在 Windows 上,该过程必须以管理员权限执行。
现在,我们也想支持 IPV6。这应该很容易,但我们无法想出一个可行的解决方案。即使没有抛出异常,套接字仍然“卡”在读取操作上。那里从来没有收到任何东西。
为了捕获IPV6数据包,我们稍微修改一下上面的程序
Socket(AddressFamily.InterNetworkV6, SocketType.Raw, ProtocolType.IPv6)
创建一个套接字(注意:使用 ProtocolType.Udp
也无济于事)socket.Bind(new IPEndPoint(IPAddress.Parse("fe80::dd37:936f:d87:b70c"), 0));
)。注意:添加范围 ID(如 fe80::dd37:936f:d87:b70c%9
)也无济于事。 我尝试过的另一件事:
socket.DualMode = true;
将套接字设置为双模式在 (1) 和 (2) 之间。 socket.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, false);
在套接字上禁用仅 IPV6 选项在 (1) 和 (2) 之间。 我通过打开 Chrome 来测试这一点 - Chrome 会为其 chrome-cast 功能为 IPV6 和 IPV4 触发一个 MDNS 数据包。 Wireshark(使用内核驱动程序)看到这个数据包并正确显示它。我的代码不会从读取操作中解除阻塞。
我使用支持 IPV6 的 Windows 10。
如何从 IPV4 中的网络接口(interface)读取所有 IPV6 数据包的想法?
谢谢。
最佳答案
解决方案是使用 ProtocolType.IP 而不是 ProtocolType.IPv6。
关于c# - 如何使用.Net Core 从网络接口(interface)接收所有 IPV6 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64008077/