gpt4 book ai didi

c - 如何从 C 中的现有 TAP 接口(interface)读取/写入

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:41 25 4
gpt4 key购买 nike

我有一个在命令行上创建的现有点击设备 (tap0)。

# ip tuntap add dev tap0 mode tap

我想使用 C 程序读取进入该接口(interface)的任何数据。我检查了其他 SO 问题,但找到了通过打开 /dev/net/tun 创建接口(interface)的代码。

谁能提供一些关于如何打开和阅读现有界面的指导?我不确定应该为 tap0 打开哪个文件?

最佳答案

打开现有的 tun/tap 界面的方式与创建新界面的方式类似。使用 ioctl(TUNSETIFF) 时,只需为接口(interface)命名即可:

const int fd = open("/dev/net/tun", O_RDWR);
if (fd != -1)
{
struct ifreq ifr;

memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN | IFF_NO_PI;

strncpy(ifr.ifr_name, "tun0", IFNAMSIZ); // <<<<=== THIS WAY

if (ioctl(fd, TUNSETIFF, &ifr) != -1)
{

如果没有 strncpy 行,代码会创建一个带有一些免费号码的新界面。通过该行,它会尝试打开 tun0。注意:如果 tun0 已被其他进程打开,则失败。

以上是使用 IFF_TUN 测试的。我还没有尝试过 IFF_TAP。

可以使用文件描述符(fd)进行读写:

tun 的例子:

char buffer[0x1000];

const int len = read(fd, buffer, sizeof(buffer));
if (len > 0)
{
static const char IPV6_VER_MASK = 0x60;

if ((buffer[0] & IPV6_VER_MASK) == IPV6_VER_MASK)
{
handle_ipv6_packet((const struct ip6_hdr*)buffer, len);
}
}

关于c - 如何从 C 中的现有 TAP 接口(interface)读取/写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55274269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com