c# - 如何使用.Net Core 从网络接口(interface)接收所有 IPV6 数据包?

标签 c# sockets networking .net-core ipv6

在我的公司,我们开发了一个网络产品,它就像一个嗅探器。
为了捕获所有 IPV4 数据包,我们遵循下一个过程:

  • 创建一个原始套接字(确切代码:new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Udp);
  • 将其绑定(bind)到网络接口(interface)的IPV4地址,端口0(确切代码:socket.Bind(new IPEndPoint(address, 0));)
  • 如果我们在 Windows 上,请将套接字设置为混杂模式(确切代码: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 也无济于事)
  • 绑定(bind)到链接本地地址(例如:socket.Bind(new IPEndPoint(IPAddress.Parse("fe80::dd37:936f:d87:b70c"), 0));)。注意:添加范围 ID(如 fe80::dd37:936f:d87:b70c%9 )也无济于事。
  • 在 Windows 上,将套接字设置为混杂模式,就像 IPV4 过程一样。

  • 我尝试过的另一件事:
  • 通过调用 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/

    相关文章:

    java - 在 Java 中重用 ObjectOutputStreams

    c# - 在 ASP.NET Web API 2.2 中启用 OData v4.0 路由时遇到问题

    带套接字的 C++ MFC 服务器应用程序崩溃,我找不到故障,求助!

    c++ - 为客户端知道服务器发送的包有多大的好处

    c# - 我如何知道服务器已使用套接字通过 UDP 关闭

    python - 发送稀疏文件

    Java Socket 数据包读取重叠

    c# - WCF 错误 : Manual addressing is enabled on this factory, 所以发送的所有消息都必须预先寻址

    c# - Observable.FromAsync 内存泄漏 [墨尔本开发者/Devicenet]

    c# - 每当对表单内的文本框、组合框等进行任何更改时都会触发事件