zoukankan      html  css  js  c++  java
  • vtun 虚拟网卡创建过程

    只分析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){.....}                         //进行udpsocket创建等操作
                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);                        
        .......
    }
  • 相关阅读:
    java synchronized详解
    android 刷新系统资源库
    android4.1 源码 支持的 时区
    Logcat过滤及常见用法整理
    Android系统 广播Intent 小结
    android adb push 与 adb install 区别(两种安装APK的方法)
    Intent的常用Flag参数:
    java里的 thread 源码
    instanceof 运算符 小结
    Android下屏保程序的开发须知
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2705428.html
Copyright © 2011-2022 走看看