//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. Android 组件之Service解析

    原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/50866875 李济洲的博客 Service是Android四大组件之中的一个.S ...

  2. maven的学习系列(二)—maven的文件夹结构

    maven的文件有自己的组织方式,例如以下所看到的: ---maven ----src ---main ----java ---test ----java -----pom.xml 当运行完mvn c ...

  3. C++虚继承的概念(转)

    http://blog.csdn.net/wangxingbao4227/article/details/6772579 C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同 ...

  4. java与MFC中的一些常识

    一个.java文件中可以有很多类.不过注意以下几点:1.public 权限的类只能有一个(也可以一个都没有,但最多只有1个)2.这个.java文件的文件名必须是public类的类名(一般的情况下,这里 ...

  5. AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机)

    AOSP ON MAKO(在NEXUS 4上刷ANDROID 4.4 源代码包-下载/配置/编译/刷机) 特别感谢google官方文档及AOSP源代码开放 參考链接: https://source.a ...

  6. ssh 保持连接

    ssh 保持连接 使用 ssh 登陆到云主机上,一段时间没有操作终端,会发现 ssh 连接断了,终端无响应. 配置 ssh 客户端,使其以一定间隔时间向 sshd 服务端发送心跳包,可解决此问题. / ...

  7. PHP后台批量删除数据

    html <form action="" method="post"> <div><input type="submit ...

  8. 5分钟快速入门Markdown

    Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. Markdown的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人用它写 ...

  9. Appium python自动化测试系列之认识Appium(四)

    ​4.1界面认识 在之前安装appium的时候说过我们有两种方法安装,也就有两种结果,一种是有界面的,一种是没有界面的,首先我们先讲一下有界面的,以及界面有哪些东西. 首先看第一幅图,如果你的是win ...

  10. 2016/07/07 PHP的线程安全与非线程安全版本的区别

    Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...