【问题标题】:Receiving an entire UDP packet接收整个 UDP 数据包
【发布时间】:2011-03-30 00:32:50
【问题描述】:

我正在用 C++ 编写一个用于 Windows 的 UDP 代理应用程序,它使用 Winsock 发送和接收 UDP 数据包。问题是我需要处理整个数据包,而不仅仅是数据和 UDP 和/或 IP 标头。我已经尝试过使用 IP_HDRINCL 的原始套接字(可能拼写错误),但它仍然会从数据包中删除一些信息。如果在winsock中不可能的话,是否有某种图书馆或其他东西可以让我完成这个?

【问题讨论】:

  • 也许您可以解释您需要的哪些其他信息不是您提供的 API 提供的。
  • 使用winsock,通常它只是将数据传递给您,其中包含来自某些结构的标题的信息。使用原始套接字,如果内存可用,它会删除以太网标头。我只想要绝对简单、完整、完整的数据包,根本不需要修改。

标签: c++ windows sockets packet


【解决方案1】:

这里有一些在windows中过滤数据包:

  1. WinDivert 在 Windows 7、2008 或 上。网络层。
  2. WinpkFilter 3.0 商业版、Windows XP 及更高版本。数据链接 层
  3. pcausa,商业。数据链路层
  4. Windows Filtering Platform Packet Modification Sample 样品 要创建 WinDivert 使用的标注驱动程序,您现在应该 实现内核驱动。网络层。

【讨论】:

    【解决方案2】:

    对于接收数据包,WinPCAP 将让您完成所有这些以及更多操作,并且有示例代码 here 展示了如何捕获到达接口的所有数据包。

    【讨论】:

    • 我已经看到 WinPCAP 可以让你完全按照你想要的方式发送数据包,但是你能以与 winsock 类似的方式接收数据包,使用 bind() 和一切吗?我认为使用 WinPCAP,您必须接收到计算机上任何端口的所有数据包。
    • 不一定——请看上面示例代码链接中的第二个示例,它显示了如何设置过滤器,这将允许您只接收您感兴趣的数据包。不,您不需要使用 bind() 等;您只会收到原始数据包数据。
    • 我对这个计算领域并不精通,但是不会接收到您的计算机收到的每个数据包并且仅对其进行过滤比仅接收为您准备的数据包要慢得多吗?
    • 这取决于它们被过滤的位置。无论如何,到达您计算机的所有包裹都需要过滤。 PCAP 在内核中进行过滤(afaik),因此它不应该比过滤窗口执行的慢得多。您需要保持混杂模式处于停用状态,因为此过滤器通常直接在硬件中实现。无论如何,其他一切都在 CPU 上完成。
    • 对上述内容的最后一个补充——在有线以太网中,计算机连接的网络交换机几乎可以确保只有用于该计算机或广播的数据包才会发送到该计算机.因此,即使打开了混杂模式,也几乎没有额外的开销。当然,WiFi 是另一回事。
    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 2013-11-08
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2012-10-03
    相关资源
    最近更新 更多