1

我正在尝试使用 libpcap 实现重放存储在 .pcap 文件中的数据包。这个过程非常简单:我会用 'pcap_open_offline' 打开 pcap 文件,然后将数据包传递给用 打开的设备pcap_open_live,并pcap_inject通过接口发送它们。

现在 NIC 没有连接以太网电缆。我知道这pcap_open_live不会说明打开的设备是否支持发送,所以我从 pcap_inject ( errno 100) 得到错误。这是可以预料的吗?如果我只是从 cmd 行中使用 tcpreplay,它会完成并且不会出现错误,无论是否插入了以太网电缆。

任何人都知道 tcpreplay/tcpedit 如何处理“死”接口?tcpreplay 是否会在我尝试将它们原始发送时重写数据包标头?任何帮助表示赞赏!

我在 Ubuntu 14.04 上,界面无地址且处于混杂模式:

auto eth1
iface eth1 inet manual
    up ifconfig eth1 promisc up
    down ifconfig eth1 promisc down
4

1 回答 1

1

现在 NIC 没有连接以太网电缆。

那么你希望通过在那个 NIC 上发送数据包得到什么有用的结果呢?

我知道这pcap_open_live不会告诉您打开的设备是否支持发送

设备是否启动会随着时间而改变,因此pcap_open_live()在您实际尝试发送数据包时,您得到的任何答案都可能不正确。

所以我从 pcap_inject ( errno 100)得到错误

在 Linux errno.h 中搜索 100 显示:

#define ENETDOWN    100 /* Network is down */

我猜当人们试图在一个因系统调用而关闭的接口上发送数据包时,Linux 网络不喜欢它send(),这就是 libpcap 所做的。

这是可以预料的吗?

是的。

如果我只是从 cmd 行中使用 tcpreplay,它会完成并且不会出现错误

tcpreplay 有一大堆不同的机制用于发送数据包。请参阅tcpreplay 源sendpacket()中的sendpacket.c源文件。例如,其中一些可能会静默丢弃在死接口上发送的数据包,而不是报告错误,并且它可能正在使用其中一种机制。

于 2015-10-08T06:11:52.143 回答