vtun 虛擬網卡創建過程
系統
1991 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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元