博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vtun中setsockopt fcntl等有关套接字设置
阅读量:5127 次
发布时间:2019-06-13

本文共 1139 字,大约阅读时间需要 3 分钟。

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等选项无关紧要。

转载于:https://www.cnblogs.com/helloweworld/archive/2012/10/09/2717335.html

你可能感兴趣的文章
datetime
查看>>
一种达到人工批改效果的英语语法自动纠错的方法
查看>>
os模块
查看>>
spring mvc 解决 Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml] 异常
查看>>
Android反编工具的使用-Android Killer
查看>>
html5新属性
查看>>
java多线程之ReentrantLock
查看>>
94.Txx考试
查看>>
python基础day7_购物车实例
查看>>
DOM:通过文本框向下拉列表中添加内容
查看>>
picker组件 label组件讲解
查看>>
.NET面试大全
查看>>
InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效
查看>>
数组排序
查看>>
OR 连接查询注意
查看>>
spring奇怪异常记录(会逐渐记录)
查看>>
Entity Framework使用汇总
查看>>
solr系统query检索词特殊字符的处理
查看>>
『编程题全队』团队作业9---项目验收与总结
查看>>
Oracle中快速删除所有表数据
查看>>