pcap_inject 在断开连接的接口上

pcap_inject on a disconnected interface

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

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

有人知道 tcpreplay/tcpedit 如何处理 "dead" 接口吗? tcpreplay 是否重写数据包 headers 而我正在尝试发送它们?感谢您的帮助!

我在 Ubuntu 14.04 上,界面是 address-less 并且处于混合模式:

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

Now the NIC doesn't have an ethernet cable connected to it.

那么您希望通过在该 NIC 上发送数据包获得什么有用的结果?

I know that pcap_open_live won't tell whether the device opened supports sending

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

so I get errors from pcap_inject (errno 100)

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

#define ENETDOWN    100 /* Network is down */

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

Is this to be expected?

是的。

If I simply use tcpreplay from the cmd line, it finishes and presents no error

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