//read操作加上超时时间。
1 int read_timeout(int fd, void *buf, uint32_t count, int time)
{
if(time > ) {
fd_set rSet;
FD_ZERO(&rSet);
FD_SET(fd, &rSet); struct timeval timeout;
memset(&timeout, , sizeof(timeout));
timeout.tv_sec = time;
timeout.tv_usec = ; int ret;
while() {
ret = select(fd+, &rSet, NULL, NULL, &timeout);
if(ret < ) {
if(errno == EINTR) continue;
ERR_EXIT("select");
} else if(ret == ) {
errno = ETIMEDOUT;
return -;
} else {
break;
}
}
}
int readNum;
readNum = read(fd, buf, count);
return readNum;
}

写超时

 int write_timeout(int fd, void *buf, uint32_t count, int time)
{
if(time > ) {
fd_set wSet;
FD_ZERO(&wSet);
FD_SET(fd, &wSet); struct timeval timeout;
memset(&timeout, , sizeof(timeout));
timeout.tv_sec = time;
timeout.tv_usec = ; int ret;
while() {
ret = select(fd+, NULL, &wSet, NULL, &timeout);
if(ret < ) {
if(errno == EINTR) continue;
ERR_EXIT("select");
} else if(ret == ) {
errno = ETIMEDOUT;
return -;
} else {
break;
}
}
}
int writeNum;
writeNum = write(fd, buf, count);
return writeNum;
}

accept超时操作

int accept_timeout(int fd, struct sockaddrin *addr, socklen_t *addrlen, int time)
{
int ret;
if(time > ) {
fd_set rSet;
FD_ZERO(&rSet);
FD_SET(fd, &rSet); struct timeval timeout;
timeout.tv_sec = time;
timeout.tv_usec = ; int selectRet;
do {
selectRet = select(fd + , &rSet, NULL, NULL, &timeout);
}while(selectRet < && selectRet == EINTR);
if(selectRet < ) {
return -;
} else if(selectRet == ) {
errno = ETIMEDOUT;
return -;
}
}
if(addr) {
ret = accept(fd, (struct sockaddr *)addr, addrlen);
} else {
ret = accept(fd, NULL, NULL);
}
return ret;
}

检测监听套接字是否可读,当监听套接字可读的时候,就认为连接队列发生了连接。

connect

 void setNonBlockMode(int fd)
{
int flags = fcntl(fd, F_GETFL);
if(flags < ) {
ERR_EXIT("fcntl");
}
flags |= O_NONBLOCK;
if(fcntl(fd, F_SETFL, flags) < ) {
ERR_EXIT("fcntl");
}
} void setBlockMode(int fd)
{
int flags = fcntl(fd, F_GETFL);
if(flags < ) {
ERR_EXIT("fcntl");
}
flags &= ~O_NONBLOCK;
if(fcntl(fd, F_SETFL, flags) < ) {
ERR_EXIT("fcntl");
} } int connect_timeout(int sockfd, struct sockaddrin *addr, socklen_t addrlen, int time)
{
int ret = -; if(time > ) {
setNonBlockMode(sockfd);
}
ret = connect(sockfd, (struct sockaddr*)addr, addrlen);
if(ret < && errno == EINPROGRESS) {
fd_set wSet;
FD_ZERO(&wSet);
FD_SET(sockfd, &wSet); struct timeval timeout;
timeout.tv_sec = time;
timeout.tv_usec = ; int selcetRet;
do{
selcetRet = select(sockfd + , NULL, &wSet, NULL, &timeout);
}while(selcetRet < && errno == EINTR);
if(selcetRet < ) {
ret = -;
} else if(selcetRet == ) {
ret = -;
errno = ETIMEDOUT;
} else if(selcetRet > ) {
int err;
socklen_t socklen = sizeof(err);
int sockoptRet = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &err, &socklen);
if(sockoptRet == -) {
ret = -;
}
if(err == ) {
ret = ;
} else {
errno = err;
ret = -;
}
}
}
if(time > ) {
setBlockMode(sockfd);
}
return ret;
}

1.设置fd为非阻塞模式。

2.调用connect操作,如果网络条件很好,比如本机两个socket发生连接,会发生成功返回。

3.正常情况下,connect立即返回-1并设置errno为EINPROGRESS 表示正在连接过程中。

4.使用select检测fd是否可写。 如果检测到可写也有如下两种情况:

  1. connect连接成功。

  2. 产生了错误,我们就需要用getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &err, &socklen); 来判断是否发生了错误。

read,write,accept,connect 超时封装的更多相关文章

  1. C Socket编程之Connect超时 (转)

    网络编程中socket的分量我想大家都很清楚了,socket也就是套接口,在套接口编程中,提到超时的概念,我们一下子就能想到3个:发送超时,接收超时,以及select超时(注:select函数并不是只 ...

  2. VC socket Connect 超时时间设置

    设置connect超时很简单,CSDN上也有人提到过使用select,但却没有一个令人满意与完整的答案.偶所讲的也正是select函数,此函数集成在winsock1.1中,简单点讲,"作用使 ...

  3. 设置linux中tcp默认的20秒connect超时时间(转)

    无论你用任何语言或者是网络库,你都可以设置网络操作的超时时间,特别是connect.read.write的超时时间. 你可以在代码中把超时时间设置任意大小值,但是connect方法会有一点特殊. co ...

  4. linux下connect超时时间探究

    最近在linux做服务器开发的时候,发现了一个现象:服务器在启动的时候调用了 connect 函数,因为连接了一个不可用的端口,导致connect最后报出了 “Connection timed out ...

  5. linux 设置connect 超时代码[select/epoll]

    转载请注明来源:https://www.cnblogs.com/hookjc/ linux下socket编程有常见的几个系统调用: 对于服务器来说, 有socket(), bind(),listen( ...

  6. [转]windows下设置socket的connect超时

    原文地址:http://www.cnblogs.com/BloodAndBone/archive/2012/05/22/2513338.html 变相的实现connect的超时,我要讲的就是这个方法, ...

  7. iOS 设置connect超时

    NSLock *theLock; [theLock lock]; int fd, error; struct sockaddr_in addr; ))<) { cout<<" ...

  8. Linux下connect超时处理【总结】

    1.前言 最近在写一个测试工具,要求快速的高效率的扫描出各个服务器开放了哪些端口.当时想了一下,ping只能检测ip,判断服务器的网络是连通的,而不能判断是否开放了端口.我们知道端口属于网络的应用层, ...

  9. Socket相关函数(1)- socket(), bind(), listen(), accept(), connect(), TCP模型

    tcp_server.c #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #in ...

随机推荐

  1. odoo 的时差 坑 [updated]

    很多人掉进了odoo的时间坑 odoo约定关于日期的数据,存放在数据库时,以 utc0 时区也就是不带时区存放,应用程序读取日期展示日期时,转换成用户的时区展示.用户的时区通过context传递. o ...

  2. POJ2376 Cleaning Shifts 【贪心】

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11542   Accepted: 3004 ...

  3. 【每日Scrum】第五天(4.26) TD学生助手Sprint2站立会议

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 今天增加了几个页面的子菜单,然后设计了几个要用的界面 今天和楠哥做了课程事件和日历表操作的例子,并尝试做时间表和日历表的数据库设计 安卓的数据 ...

  4. Django-mysq数据库链接问题

    Django链接MySQL数据库有可能会报no model named MySQLdb, 解决办法: 首先安装pymysql 然后进入到项目目录,找到__init__.py文件,在里面添加 impor ...

  5. 【CUDA】CUDA开发环境搭建

    http://blog.csdn.net/tracer9/article/details/50484764 标签: CUDA并行计算NVIDIAlinux 2016-01-08 18:35 637人阅 ...

  6. oracle sql 当初始化数据时避免重复主键

    一:当有主键序列自动增长时候(序列为:seq_cct_id) insert into cs_cost_type (CCT_ID, CCT_NAME, CCT_RATE, CCT_RATE_TYPE, ...

  7. 分治分块与计算几何练习 [Cloned]

    https://cn.vjudge.net/contest/148706 A #include<cstdio> #include<cstring> #include<cm ...

  8. 【BZOJ2338】[HNOI2011]数矩形 几何

    [BZOJ2338][HNOI2011]数矩形 题解:比较直观的做法就是枚举对角线,两个对角线能构成矩形当且仅当它们的长度和中点相同,然后用到结论:n个点构成的矩形不超过n^2.5个(不会证),所以两 ...

  9. EasyDarwin开源团队招募开发组成员

    EasyDarwin开源流媒体服务器项目招募开发组成员,共同更新和维护EasyDarwin流媒体服务器,决策EasyDarwin后续开发方向: 加入要求: 1.对开源流媒体项目有浓厚兴趣: 2.有一定 ...

  10. mybatis入门小结(六)

    入门小结---查询 1.1.1.1.1 #{}和${} #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以 ...