2010-08-16 23 views
0

有没有任何可行的替代Winsock for C++?我需要的原因是因为Winsock的原始套接字不能正常工作(不,这不能解决,不要浪费你的时间)并且WinPCAP只能监视网络流量,而不能实际接收数据包。我需要一些可以接收完整数据包的东西,包括任何IP,UDP,TCP标头等。是否存在这样的事情,如果不存在,为什么不呢?Winsock的替代(不,不WinPCAP)

+9

我要浪费我的时间问:为什么它不为你工作?如果你要声称[适用于其他人的产品]不起作用,那么你应该至少花一两句话来支持它。 – Thanatos 2010-08-16 02:32:51

+0

解释时间太长,会导致更多问题。 – Chroma 2010-08-16 02:39:27

+1

你是对的 - 它通常导致更多的问题,并且大多数时候(特别是当OP没有解释他们的情况时),这导致我们发现他们没有正确使用[适用于其他人的产品]。例如,几乎每个“我认为我在GCC中发现了一个错误”帖子。因此,我问时间浪费的问题。 – Thanatos 2010-08-16 02:43:25

回答

1

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

+0

这样你就可以收到整个数据包,包括所有标题和所有内容? – Chroma 2010-08-16 02:25:11

+0

Boost.Asio封装了BSD套接字库。看到Winsock可以做到这一点(Winsock也是基于BSD套接字),那么Asio就可以做到这一点。 basic_socket类包装'ioctl'函数。 – Anthony 2010-08-16 02:37:25

+0

是的,boost可以保证你收到整个数据包。看看http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/async_read.html – Default 2010-08-23 09:23:48

6

WinPcap的只能监控网络流量,没有实际接收数据包

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

这是非常有可能使用Winsock API需要的东西,可以得到完整的数据包,包括任何IP,UDP,TCP报头,等等。看看WSAIoctl函数,特别是SIO_RCVALL选项 - 启用该选项将在接口上接收的所有数据包传递到套接字。这些是以IP头开始的原始IP数据包。

+0

没有,监控流量不等于接收数据包,因为当你监督,你只观察谈话的其他项目无法参与。我不想收到网络上的所有数据包,我只想要那些我通常会得到的数据包,但我想要标题。 – Chroma 2010-08-16 02:41:39

+0

难道你不能写一个函数,将所有的数据包缩小到你想要的数据包,并将这些数据传递给系统的其余部分? – Thanatos 2010-08-16 02:46:36

+3

@Chroma:原始数据包本身不对应任何应用程序。这是头文件中的端口号,它们将它们引导至正确的程序。所以你有两种选择:要么得到所有的原始数据包,要么自己过滤它们,要么让操作系统为你做这件事并丢失头文件。 – casablanca 2010-08-16 02:53:58