有谁知道如何将数据包写入 C 中的 TAP 接口(interface)?还是其他语言?
我自己构建了一个以太网数据报,我想将其写入特定的tap接口(interface)。
谢谢! :)
关于 TAP:http://en.wikipedia.org/wiki/TUN/TAP
最佳答案
假设您已经创建了一个 TAP 接口(interface)(使用 ip tuntap add
),您可以使用 数据包套接字 将数据写入其中(尝试 man 7 packet
了解更多信息)。
首先,使用 int sockfd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))
创建一个数据包套接字。
第二步,找到TAP接口(interface)的接口(interface)索引(ifindex
)。只需运行命令 ip link
并记下每行开头的数字。例如,
[nav@blumarine Test02]$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: p12p1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT qlen 1000
link/ether 00:26:b9:24:82:16 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DORMANT qlen 1000
link/ether c4:17:fe:8c:f7:c8 brd ff:ff:ff:ff:ff:ff
lo
的 ifindex 为 1,eth0
的 ifindex 为 3。第三步,填写一个
sockaddr_ll
结构体传递给sendto()
api。此结构用于保存有关数据包目标地址的信息。完全按照这种方式填写:struct sockaddr_ll SendSockAddr;
SendSockAddr.sll_family = AF_PACKET;
SendSockAddr.sll_halen = ETH_ALEN;
SendSockAddr.sll_ifindex = ifindex; // The number we just found earlier..
SendSockAddr.sll_protocol = htons(ETH_P_ALL);
SendSockAddr.sll_hatype = 0;
SendSockAddr.sll_pkttype = 0;
最后,使用
sendto()
将您的数据包发送出去。使用 man 3 sendto
获取有关 sendto()
和 man 7 packet
的更多信息,以更深入地了解 struct sockaddr_ll
。祝你好运 :)
关于c - 如何在C中将数据包写入TAP接口(interface)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14743535/