如何在C中将数据包写入TAP接口?

ioe*_*ric 2 c linux networking driver

有人知道如何将数据包写入C中的TAP接口吗?还是其他任何语言?

我自己构建了一个以太网数据报,我想把它写到一个特定的tap接口.

谢谢!:)

关于TAP:http://en.wikipedia.org/wiki/TUN/TAP

nav*_*nav 8

假设您已经创建了一个TAP接口(使用ip tuntap add),您可以使用Packet Socket将数据写入其中(尝试man 7 packet获取更多信息).

首先,使用int sockfd = socket(AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL))创建数据包套接字.

第二步是找到TAP接口的接口索引(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
Run Code Online (Sandbox Code Playgroud)

ifindex lo将为1,而eth0将为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;
Run Code Online (Sandbox Code Playgroud)

最后,sendto()用来发送你的数据包.用于man 3 sendto获取更多信息sendto()以及man 7 packet更深入了解struct sockaddr_ll.

祝好运 :)