• TAP/TUN(二)


    转:http://www.cnblogs.com/yml435/p/5941772.html

    tap.c代码
        
    1. #include<assert.h>
    2. #include<fcntl.h>
    3. #include<stdio.h>
    4. #include<string.h>
    5. #include<sys/socket.h>
    6. #include<sys/ioctl.h>
    7. #include<linux/if.h>
    8. #include<linux/if_tun.h>
    9. #include<sys/types.h>
    10. #include<errno.h>
    11. #include<net/route.h>
    12. intTap=0;
    13. intTap1=0;
    14. int interface_up(char*interface_name)
    15. {
    16. int s;
    17. if((= socket(PF_INET,SOCK_STREAM,0))<0)
    18. {
    19. printf("Error create socket :%m/n", errno);
    20. return-1;
    21. }
    22. struct ifreq ifr;
    23. strcpy(ifr.ifr_name,interface_name);
    24. short flag;
    25. flag = IFF_UP;
    26. if(ioctl(s, SIOCGIFFLAGS,&ifr)<0)
    27. {
    28. printf("Error up %s :%m/n",interface_name, errno);
    29. return-1;
    30. }
    31. ifr.ifr_ifru.ifru_flags |= flag;
    32. if(ioctl(s, SIOCSIFFLAGS,&ifr)<0)
    33. {
    34. printf("Error up %s :%m/n",interface_name, errno);
    35. return-1;
    36. }
    37. return0;
    38. }
    39. int tun_create(char*dev,int flags)
    40. {
    41. struct ifreq ifr;
    42. int fd, err;
    43. assert(dev != NULL);
    44. if((fd = open("/dev/net/tun", O_RDWR))<0){
    45. return fd;
    46. }
    47. memset(&ifr,0,sizeof(ifr));
    48. ifr.ifr_flags |= flags;
    49. if(*dev !=''){
    50. strncpy(ifr.ifr_name, dev, IFNAMSIZ);
    51. }
    52. if((err=ioctl(fd,TUNSETIFF,(void*)&ifr))<0){
    53. close(fd);
    54. return err;
    55. }
    56. strcpy(dev,ifr.ifr_name);
    57. return fd;
    58. }
    59. int main(int argc,char*argv[])
    60. {
    61. char tun_name[IFNAMSIZ]="tap0";
    62. char tun_name1[IFNAMSIZ]="tap1";
    63. Tap=tun_create(tun_name, IFF_TAP | IFF_NO_PI);
    64. if(Tap<0){
    65. perror("tun_create");
    66. return1;
    67. }
    68. printf("TAP name is %s ", tun_name);
    69. printf("Tap=%d ",Tap);
    70. //interface_up(tun_name);
    71. system("ifconfig tap0 10.66.31.185 netmask 255.255.0.0 up");
    72. while(1);
    73. }
     

    程序要一直运行,否则程序退出后创建的TAP设备会被释放


    在前面讲到了TAP口的基本原理。
    那么我们直接用TAP口转发报文和TAP口绑定的虚拟网卡上用socket上发报文有什么区别呢?
        
     我上图,我们可以看到, Virtual NIC 就是我们的虚拟网卡,那么如果从TAP口进行报文发送的时候,
    我们说了,TAP的使用者就相当于远程机器的网卡,也就是说报文会从虚拟网卡进入到协议栈,然后走内核
    的转发流程进行转发(如果是本机就再去LocalIn点),否则就通过forward 到postRoute节点再次进入到TAP口,被
    TAP接收后到应用层进行再次转发出去。
    但是如果是通过Virtual NIC的socket发送消息就不同了,会先进入到内核,然后进入到转发面(LocalOut->forward),如果是本机发给本机的,报文就会进入到LocalIn节点,再被socket接收。
        如果是非本机的,就会通过postRoute发出去,再进入到TAP口被应用层转发面走转发流程。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     



  • 相关阅读:
    迭代加深搜索 codevs 2541 幂运算
    二叉树结构 codevs 1029 遍历问题
    深搜+DP剪枝 codevs 1047 邮票面值设计
    2016.6.10 深度优先搜索练习
    二分+动态规划 POJ 1973 Software Company
    tarjan算法求桥双连通分量 POJ 3177 Redundant Paths
    tarjan算法+缩点:求强连通分量 POJ 2186
    tarjan算法求割点cojs 8
    关键路径 SDUTOJ 2498
    第二章 STM32的结构和组成
  • 原文地址:https://www.cnblogs.com/newjiang/p/7611329.html
Copyright © 2020-2023  润新知