我尝试使用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上,接口是无地址且处于promisc模式:
auto eth1
iface eth1 inet manual
up ifconfig eth1 promisc up
down ifconfig eth1 promisc down
答案 0 :(得分:1)
现在NIC没有连接以太网电缆。
那么你期望通过在该NIC上发送数据包获得什么有用的结果?
我知道
pcap_open_live
无法判断设备是否支持发送
设备是否启动可能会随着时间的推移而发生变化,因此,当您实际尝试发送数据包时,您从pcap_open_live()
获得的任何答案都可能不正确。
所以我从pcap_inject(
中得到错误errno 100
)
在Linux中搜索100 errno.h显示:
#define ENETDOWN 100 /* Network is down */
我猜想,当人们尝试在一个send()
系统调用失败的接口上发送数据包时,Linux网络不喜欢它,这就是libpcap的作用。
这是预期的吗?
是
如果我只是使用cmd行中的tcpreplay,它就会完成并且不会出现错误
tcpreplay有一大堆用于发送数据包的不同机制。请参阅tcpreplay源代码中sendpacket()
源文件中的sendpacket.c
。例如,其中一些可能会静默丢弃在死接口上发送的数据包,而不是报告错误,并且可能正在使用其中一种机制。