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);                        
        .......
    }
  • 相关阅读:
    C++ 模板特化
    左值引用,右值引用以及移动语义
    搜狐2016研发工程师编程题
    java配置环境变量与常用技巧
    java在线聊天项目 使用SWT快速制作登录窗口,可视化窗口Design 更换窗口默认皮肤(切换Swing自带的几种皮肤如矩形带圆角)
    c++中的结构体:声明 定义 初始化
    用指针变量作函数形参接收数组地址,解决10个整数按由小到大顺序排序问题
    java在线聊天项目 实现基本聊天功能后补充的其他功能详细需求分析 及所需要掌握的Java知识基础 SWT的激活方法,swt开发包下载,及破解激活码
    java在线聊天项目1.0版 异常处理——开启多个客户端,关闭一个客户端后,在其他客户端中再发出信息会出现异常的处理
    第十一次作业
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2705428.html
Copyright © 2011-2022 走看看