【问题标题】:How to write a packet to TAP interface in C?如何在C中将数据包写入TAP接口?
【发布时间】:2013-02-07 04:25:32
【问题描述】:

有谁知道如何在 C 语言中将数据包写入 TAP 接口?还是其他语言?

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

谢谢! :)

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

【问题讨论】:

标签: c linux networking driver


【解决方案1】:

假设您已经创建了一个 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

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 的信息。

祝你好运:)

【讨论】:

  • 非常感谢!我发现我可以在 libpcap 中使用 send_packet() 函数,它也调用了 sendto()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2012-10-13
  • 2019-10-06
相关资源
最近更新 更多