开发者社区> 问答> 正文

如何从C中现有的TAP接口读取/写入

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

# ip tuntap add dev tap0 mode tap

我想使用C程序读取该接口上传入的所有数据。我检查了其他SO问题,但是找到了通过打开创建接口的代码/dev/net/tun。

任何人都可以提供有关如何打开和阅读现有界面的指导吗?我不确定应该打开哪个文件tap0?

展开
收起
祖安文状元 2020-01-05 18:55:29 835 0
1 条回答
写回答
取消 提交回答
  • 打开现有的tun / tap界面与创建新界面类似。仅在使用ioctl(TUNSETIFF)时给接口命名:

    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);
        }
    }
    
    2020-01-05 18:55:48
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载