zoukankan      html  css  js  c++  java
  • vtun中setsockopt fcntl等有关套接字设置

    client.c文件中在建立socket后有一句

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

    SO_REUSEADDR允许重用本地地址。

    client.c文件在bind之后的connec_t函数中,

    先将socket设为非阻塞,然后connect 然后select然后再将socket状态改为原来的。

    这样做的目的是select超时就退出了。

    如果不这样,client端一直在connect状态,没有超时退出这个操作。

    int connect_t(int s, struct sockaddr *svr, time_t timeout)
    {
    #if defined(VTUN_SOCKS) && VTUN_SOCKS == 2
         /* Some SOCKS implementations don't support
          * non blocking connect */
         return connect(s,svr,sizeof(struct sockaddr));
    #else
         int sock_flags;
         fd_set fdset;
         struct timeval tv;

         tv.tv_usec=0; tv.tv_sec=timeout;

         sock_flags=fcntl(s,F_GETFL);
         if( fcntl(s,F_SETFL,O_NONBLOCK) < 0 )//设置s为非阻塞
            return -1;

         if( connect(s,svr,sizeof(struct sockaddr)) < 0 && errno != EINPROGRESS)
            return -1;

         FD_ZERO(&fdset);
         FD_SET(s,&fdset);
         if( select(s+1,NULL,&fdset,NULL,timeout?&tv:NULL) > 0 ){
            int l=sizeof(errno);    
            errno=0;
            getsockopt(s,SOL_SOCKET,SO_ERROR,&errno,&l);
         } else
            errno=ETIMEDOUT;     

         fcntl(s,F_SETFL,sock_flags);

         if( errno )
            return -1;

         return 0;
    #endif
    }//end connect_t

     

    除此之外client端还有SO_KEEPALIVE和地址重用设置。

     

    server端有个getpeername等选项无关紧要。

  • 相关阅读:
    解读setTimeout, promise.then, process.nextTick, setImmediate的执行顺序
    规范git commit提交记录和版本发布记录
    《Javascript设计模式与开发实践》--读书笔记
    一个简洁明了的表达式拼接例子.md
    前端知识分享.md
    PHP常用框架.md
    关于软件版本以及VS版本扩展介绍
    WPF 优秀控件.md
    Deepin 常见问题锦集
    一些面向对象的设计法则
  • 原文地址:https://www.cnblogs.com/helloweworld/p/2717335.html
Copyright © 2011-2022 走看看