vtun 虚拟网卡创建过程
系统
1817 0
只分析udp,
单独运行clinet,处于connect状态,并没有运行到tunnel这个步骤,单独运行client时没出现虚拟网卡;
单独运行server,处于listen状态,也没运行到tunnel这个步骤,所以单独运行server也不会出现虚拟新网卡。
当server端开启,处于监听状态,这时client请求连接,认证成功后client和server才会进入tunnel执行打开虚拟网卡,
以及读写发送等后续操作。
为深入理解虚拟网卡的建立过程,得深入学习套接字的阻塞和非阻塞问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
|
int
tunnel
(
struct
vtun_host *host)
{
......
if
( (host->persist == VTUN_PERSIST_KEEPIF) && (host->loc_fd >= 0) )
//
接口是否已经打开
interface_already_open = 1;
if
( host->
dev
){...}
//
判断虚拟设备类型
if
(!
interface_already_open
)
//
虚拟网卡没有打开,则打开之
{
...
switch
(host->flags & VTUN_TYPE_MASK)
{
...
case
VTUN_TUN:
if
( (fd[0]=tun_open(dev)) < 0 )
//
打开虚拟网卡,获取描述符
{
vtun_syslog(LOG_ERR,
"Can't allocate tun device %s. %s(%d)"
, dev, strerror(errno), errno);
return
-1;
}
break
;
}
host->
loc_fd
=
fd
[0];
//
虚拟设备文件描述符存在
host->loc_fd
中
}
switch
( host->
flags
& VTUN_PROT_MASK )
//
初始化协议,
tcp
还是
udp
{
......
case
VTUN_UDP:
if
( (opt = udp_session(host)) == -1){.....}
//
进行
udp
的
socket
创建等操作
proto_write = udp_write;
proto_read = udp_read;
}
switch
( (
pid
=
fork
()) ){...}
//
建立子进程
switch
( host->
flags
& VTUN_TYPE_MASK )
//
根据虚拟设备类型,选择相应虚拟设备读写方式
{
.....
case
VTUN_TUN:
set_title(
"%s tun %s"
, host->host, dev);
dev_read = tun_read;
dev_write = tun_write;
break
;
}
opt
= linkfd(host);
.......
}
|
vtun 虚拟网卡创建过程
更多文章、技术交流、商务合作、联系博主
微信扫码或搜索:z360901061
微信扫一扫加我为好友
QQ号联系: 360901061
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
【本文对您有帮助就好】元