linux tun 读取数据,Linux Tun/Tap网口(/dev/net/tun)的读写方法

本文介绍了如何在Linux下使用TUN/TAP虚拟网卡进行数据读写,包括`write_tun`和`read_tun`函数的实现,并展示了`open_tun`函数的详细过程,涉及TUN/TAP设备的打开、配置和关闭。此外,还提供了Linux内核文档中关于TUN/TAP用户层操作的样例代码。
摘要由CSDN通过智能技术生成

我的代码

https://github.com/liuqun/demo-linux-tun-virtual-netcard/blob/master/demo-1-ioctl/src/main.c

代码片段1

以下代码节选自"openV屁N"的源码tun.c文件:

openV屁N封装了一组读写函数如下:

open_tun(dev_name, dev_type, dev_node, tuntap上下文)打开Tun虚拟网卡

close_tun(tuntap上下文)

n_bytes = write_tun(tuntap上下文, buf, len)

n_bytes = read_tun(tuntap上下文, buf, len)

int write_tun(struct tuntap *tt, uint8_t *buf, int len)

{

return write(tt->fd, buf, len);

}

int read_tun(struct tuntap *tt, uint8_t *buf, int len)

{

return read(tt->fd, buf, len);

}

void open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tuntap *tt)

{

struct ifreq ifr;

/*

* We handle --dev null specially, we do not open /dev/null for this.

*/

if (tt->type == DEV_TYPE_NULL)

{

open_null(tt);

}

else

{

/*

* Process --dev-node

*/

const char *node = dev_node;

if (!node)

{

node = "/dev/net/tun";

}

/*

* Open the interface

*/

if ((tt->fd = open(node, O_RDWR)) < 0)

{

msg(M_ERR, "ERROR: Cannot open TUN/TAP dev %s", node);

}

/*

* Process --tun-ipv6

*/

CLEAR(ifr);

ifr.ifr_flags = IFF_NO_PI;

#if defined(IFF_ONE_QUEUE) && defined(SIOCSIFTXQLEN)

ifr.ifr_flags |= IFF_ONE_QUEUE;

#endif

/*

* Figure out if tun or tap device

*/

if (tt->type == DEV_TYPE_TUN)

{

ifr.ifr_flags |= IFF_TUN;

}

else if (tt->type == DEV_TYPE_TAP)

{

ifr.ifr_flags |= IFF_TAP;

}

else

{

msg(M_FATAL, "I don't reco

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值