zoukankan      html  css  js  c++  java
  • vtun 建立隧道的套接字和传输截获包的套接字

    认证即隧道的建立用TCP套接字,之后根据配置文件选择合适协议传输。

    clinet隧道建立套接字和传输套接字替换

    1、在clinet函数中

    s = socket(AF_INET,SOCK_STREAM,0);

    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    bind(s,(struct sockaddr *)&my_addr,sizeof(my_addr)) ;

    2、在connect_t函数中

    fcntl(s,F_SETFL,O_NONBLOCK);

    connect(s,svr,sizeof(struct sockaddr);

    select(s+1,NULL,&fdset,NULL,timeout?&tv:NULL);

    fcntl(s,F_SETFL,sock_flags);

    3、在auth_client中

    readn_t(fd, buf, VTUN_MESG_SIZE, vtun.timeout);

    print_p(fd,"HOST: %s\n",host->host);//print_p向server发送认证信息。

    host->rmt_fd = s;    //这里的host->rmt_fd是TCP socket.

    4、认证成功后

    如果传输数据用UDP协议,在udp_session中,用UDP socket替换TCP socket.

    s=socket(AF_INET,SOCK_DGRAM,0)

    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    bind(s,(struct sockaddr *)&saddr,sizeof(saddr)

    write_n(host->rmt_fd,(char *)&port,sizeof(short)

    readn_t(host->rmt_fd,&port,sizeof(short),host->timeout)

    connect(s,(struct sockaddr *)&saddr,sizeof(saddr))

    host->rmt_fd = s;    //这里的host->rmt_fd是UDP socket

    后续数据传输是对该套接字操作。

     

    如果传输数据用TCP协议,在tunnel函数中,继续使用该TCP socket.

    setsockopt(host->rmt_fd,SOL_SOCKET,SO_KEEPALIVE,&opt,sizeof(opt) );

    setsockopt(host->rmt_fd,IPPROTO_TCP,TCP_NODELAY,&opt,sizeof(opt) );

     

     

    server隧道建立套接字和传输套接字替换

    1、listerner函数中

    s=socket(AF_INET,SOCK_STREAM,0);

    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    bind(s,(struct sockaddr *)&my_addr,sizeof(my_addr));

    listen(s, 10);

    accept(s,(struct sockaddr *)&cl_addr,&opt);

    2、auth_server函数中

    readn_t(fd, buf, VTUN_MESG_SIZE, vtun.timeout)

    print_p(fd,"OK CHAL: %s\n", cl2cs(chal_req));

    3、认证成功后

    如果传输数据用UDP协议,在udp_session中,用UDP socket替换TCP socket.

    s=socket(AF_INET,SOCK_DGRAM,0)

    setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    bind(s,(struct sockaddr *)&saddr,sizeof(saddr)

    write_n(host->rmt_fd,(char *)&port,sizeof(short)

    readn_t(host->rmt_fd,&port,sizeof(short),host->timeout)

    connect(s,(struct sockaddr *)&saddr,sizeof(saddr))

    host->rmt_fd = s;    //这里的host->rmt_fd是UDP socket

    后续数据传输是对该套接字操作。

     

    如果传输数据用TCP协议,在tunnel函数中,继续使用该TCP socket.

    setsockopt(host->rmt_fd,SOL_SOCKET,SO_KEEPALIVE,&opt,sizeof(opt) );

    setsockopt(host->rmt_fd,IPPROTO_TCP,TCP_NODELAY,&opt,sizeof(opt) );

  • 相关阅读:
    成为高级 React 开发你需要知道的知识点
    Socket 连接问题之大量 TIME_WAIT
    x == (x = y) 不等于 (x = y) == x ?
    「工具」三分钟了解一款思维导图工具:XMind Zen
    Touch Bar 废物利用系列 | 在触控栏上显示 Dock 应用图标
    vim中delete(backspace)键不能向左删除
    Vue2.0学习(四)--组件的继承与扩展
    quasar+cordova+zbar实现Android扫描条形码
    PWA技术理论+实战全解析
    分页请求时,有新数据加入时,下一页会出现重复数据问题
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2705736.html
Copyright © 2011-2022 走看看