【问题标题】:Winsock alternative (no, not WinPCAP)Winsock 替代品(不,不是 WinPCAP)
【发布时间】:2013-11-04 01:30:37
【问题描述】:

对于 C++ 的 Winsock 是否有任何可行的替代方案?我需要的原因是因为 Winsock 的原始套接字行为不正常(不,这是不可修复的,不要浪费您的时间询问)并且 WinPCAP 只能监控网络流量,而不是实际接收数据包。我需要可以接收完整数据包的东西,包括任何 IP、UDP、TCP 标头等。这样的东西是否存在,如果不存在,为什么不存在?

【问题讨论】:

  • 我会浪费时间问:为什么它不适合你?如果您要声称 [适用于其他所有人的产品] 不起作用,那么您应该至少花一两句话来支持它。
  • 解释时间太长,会引出更多问题。
  • 你是对的 - 它通常会导致更多问题,而且大多数时候(尤其是当 OP 没有预先解释他们的情况时)它会导致我们发现他们没有使用 [有效的产品其他人] 正确。以几乎所有“我认为我在 GCC 中发现错误”的帖子为例。因此,我问了浪费时间的问题。
  • 如果你的 Winsock 实现真的被破坏了,那么我担心你是个不错的朋友。我推荐了 Boost.Asio,但如果 WS32 真的 不起作用,那么它也会被破坏。
  • 其实我会尝试:对winsock的socket函数使用不同的参数要么导致我的应用程序不接收任何数据包(sock_raw,ipproto_raw),导致我创建的所有套接字接收相同的数据包(sock_raw, ipproto_udp) 或功能正常但不接收标头 (sock_dgram, ipproto_udp)

标签: c++ winsock packets


【解决方案1】:

WinPCAP 只能监控网络流量,并不能真正接收数据包

监控网络流量相当于接收数据包。这正是 Wireshark 等工具所做的:读取您的网卡并重建数据包边界。

我需要可以接收完整数据包的东西,包括任何 IP、UDP、TCP 标头等。

这很可能使用 Winsock API。查看WSAIoctl 函数,特别是SIO_RCVALL 选项 - 启用此选项会将接口上接收到的所有数据包传送到您的套接字。这些都是以 IP 标头开头的原始 IP 数据包。

【讨论】:

  • 不,监控流量不等于接收数据包,因为你监控的时候只是观察其他程序的对话,无法参与。我不想接收网络上的所有数据包,我只想要通常会收到的数据包,但我想要标头。
  • 难道你不能编写一个函数来将所有数据包缩小到你想要的数据包,然后将它们传递到系统的其余部分吗?
  • @Chroma:原始数据包本身不对应任何应用程序。标头中的端口号将它们引导到正确的程序。因此,您有两个选择:要么获取所有原始数据包并自己过滤它们,要么让操作系统为您执行此操作并丢失标头。
【解决方案2】:

您可以查看Boost.Asio。 C++ 跨平台 IO 库。支持 UDP、TCP 和 ICMP。

【讨论】:

  • 这样您就可以接收整个数据包,包括所有标头和所有内容?
  • Boost.Asio 封装了 BSD 套接字库。看到 Winsock 可以做到(而且 Winsock 也基于 BSD 套接字),那么 Asio 可以做到。 basic_socket 类包装了ioctl 函数。
  • 是的,boost 可以确保您收到了整个数据包。看boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2017-05-20
相关资源
最近更新 更多