捕获环回的数据包
Capturing packets on loopback
本文关键字:数据包 更新时间:2023-10-16
这段代码在Ubuntu 16.04上运行得非常好,当我通过环回接口抛出UDP字节时,打印正确的值(ETHERTYPE_IP):
#include <pcap.h>
#include <iostream>
#include <net/ethernet.h>
int main(int argc,char **argv)
{
char errbuf[PCAP_ERRBUF_SIZE];
auto pcap = pcap_open_live("lo0", BUFSIZ, 0, 1000, errbuf);
pcap_loop(pcap,0, [] (u_char *self, const struct pcap_pkthdr *header,
const u_char *packet) {
auto eth = (struct ether_header *) packet;
auto eth_type = ntohs(eth->ether_type);
std::cout << "eth_type: " << std::hex << eth_type << std::endl;
}, nullptr);
return 0;
}
netcat:
➜ ~ nc -uv -l 54321
Listening on [0.0.0.0] (family 0, port 54321)
➜ ~ nc -4u localhost 54321
hello
程序输出:
➜ ~ sudo ./a.out
eth_type: 800
但是在OS X 10.11.5上,它打印eth_type: 4011。有趣的是,它在en1适配器上工作得很好。
为什么在环回和非环回适配器之间存在这样的差异,在两者上捕获数据包的正确方法是什么?
更新:Tcpdump也可以工作:
➜ ~ sudo tcpdump -i lo0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
15:09:00.160664 IP localhost.54321 > localhost.63543: UDP, length 4
由于链路类型不是以太网,报头中不包含适合ether_header的数据。
在使用pcap_open_live获取句柄后添加以下代码,以查看链路层头类型:
if (pcap_datalink(pcap) != DLT_EN10MB) {
fprintf(stderr, "Device doesn't provide Ethernet headers - link type was %dn", pcap_datalink(pcap));
return 1;
}
运行此命令表示lo0的linktype值为0,DLT_NULL。文档说明这意味着"BSD环回封装;链路层报头是一个4字节的字段,按主机字节顺序,包含一个来自socket.h的PF_值,用于数据包的网络层协议。"
实际上,当我查看ether_dhost字段的前4个字节时,我看到值2,对应于PF_INET。最后,如果您试图区分UDP数据包,这并没有多大帮助。
您可以在这里找到更多文档:http://www.tcpdump.org/linktypes.html
相关文章:
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- C++ 将字符串数据包转换为 iphdr语言 - 字符串数据包的格式应该是什么?
- 不同的数据包,联合 - 正确的用法\验证?