TCP解决connect函数的超时问题

在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未完成;同时TCP的三路握手操作继续进行;在这之后,我们可以调用select来检查这个链接是否建立成功;非阻塞connect有三种用途:
1.我们可以在三路握手的同时做一些其它的处理.connect操作要花一个往返时间完成,而且可以是在任何地方,从几个毫秒的局域网到几百毫秒或几秒的广域网.在这段时间内我们可能有一些其他的处理想要执行;

2.由于我们使用select来等待连接的完成,因此我们可以给select设置一个时间限制,从而缩短connect的超时时间.在大多数实现中,connect的超时时间在75秒到几分钟之间.有时候应用程序想要一个更短的超时时间,使用非阻塞connect就是一种方法;

  1. timeval tm;  
  2. fd_set set;  
  3. unsigned long ul = 1;  
  4. ioctlsocket(sock, FIONBIO, &ul); //设置为非阻塞模式  
  5. bool ret = false;  
  6. if (connect(...) == -1)  
  7. {  
  8.     tm.tv_set  = TIME_OUT_TIME;  
  9.     tm.tv_uset = 0;  
  10.     FD_ZERO(&set);  
  11.     FD_SET(sock, &set);  
  12.   
  13.     if (select(sock, NULL, &set, NULL, &tm) > 0)  
  14.     {  
  15.         getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);  
  16.         if (error == 0)  
  17.         {  
  18.             ret = true;  
  19.         }  
  20.         else  
  21.         {  
  22.             ret = false;  
  23.         }  
  24.     }  
  25.     else  
  26.     {  
  27.         ret = false;  
  28.     }  
  29. }  
  30. else  
  31. {  
  32.     ret = true;  
  33. }  
  34. ul = 0;  
  35. ioctlsocket(sock, FIONBIO, &ul); //设置为阻塞模式  
  36. if(!ret)   
  37. {  
  38.     close( sockfd );  
  39.     printf(stderr , "Cannot Connect the server!/n");  
  40.     return;  
  41. }  
  42. printf( stderr , "Connected!/n");  

代码思路: 

1.建立socket
 2
.将该socket设置为非阻塞模式
 3
.调用connect()
 4
.使用select()检查该socket描述符是否可写

 5.根据select()返回的结果判断connect()结果
 6
.将socket重设置为阻塞模式

 

所谓阻塞函数,是指其完成指定的任务之前不允许程序调用另一个函数,在Windows下还会阻塞本线程消息的发送。

所谓非阻塞函数,是指操作启动之后,如果可以立即得到结果就返回结果,否则返回表示结果需要等待的错误信息,不等待任务完成函数就返回。

首先,异步函数是非阻塞函数;

其次,获取远地信息的数据库函数是阻塞函数(因此,WinSock提供了其异步版本);

下面对具体函数做解释:

[cpp]  view plain copy
  1. int select(  
  2.   __in          int nfds,//本参数忽略,仅起到兼容作用  
  3.   __in_out      fd_set* readfds,//指向一组等待可读性检查的套接口,可为NULL  
  4.   __in_out      fd_set* writefds,//指向一组等待可写性检查的套接口,可为NULL  
  5.   __in_out      fd_set* exceptfds,//指向一组等待错误检查的套接口,可为NULL  
  6.   __in          const struct timeval* timeout//select()最多等待时间,对阻塞操作则为NULL  
  7. );  
  8.   
  9.   
  10.    

 

 本函数用于确定一个或多个套接口的状态。对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。用fd_set结构来表示一组等待检查的套接口

 readfds参数标识等待可读性检查的套接口。如果该套接口正处于监听listen()状态,则若有连接请求到达,该套接口便被标识为可读,这样一个accept()调用保证可以无阻塞完成。对其他套接口而言,可读性意味着有排队数据供读取。或者对于SOCK_STREAM类型套接口来说,相对于该套接口的虚套接口已关闭,于是recv()或recvfrom()操作均能无阻塞完成

writefds参数标识等待可写性检查的套接口。如果一个套接口正在connect()连接(非阻塞),可写性意味着连接顺利建立。如果套接口并未处于connect()调用中,可写性意味着send()和sendto()调用将无阻塞完成。〔但并未指出这个保证在多长时间内有效,特别是在多线程环境中〕。

exceptfds参数标识等待带外数据存在性或意味错误条件检查的套接口。请注意如果设置了SO_OOBINLINE选项为假FALSE,则只能用这种方法来检查带外数据的存在与否。对于SO_STREAM类型套接口,远端造成的连接中止和KEEPALIVE错误都将被作为意味出错。如果套接口正在进行连接connect()(非阻塞方式),则连接试图的失败将会表现在exceptfds参数中。

返回值:
   select()调用返回处于就绪状态并且已经包含在fd_set结构中的描述字总数;如果超时则返回0;否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node.js异步式IO与事件式编程

Node.js最大的特性就是异步式I/O与事件紧密结合的编程模式。这种模式与传统的同步式IO线性的编程思路有很大的不同,因为控制流很大程度上要靠事件和回调函数来组织,一个逻辑要拆分为若干个单元格。内容:阻塞和线程1.同步式I/O或阻塞式I/O线程…

几个重要库函数的实现

面试官很喜欢让求职者写一些常用库函数的实现,有很多是和字符串相关的,有一些是关于内存拷贝的。一般,常会让写的函数有以下几个: strcpy , strncpy, memcpy。 memset一般不会让去写,但这个函数…

CDH 5.13.0 集成 Phoenix

1.下载Phoenix http://phoenix.apache.org/download.html 找到对应版本 点击parcels (cdh可安装版本) http://www.apache.org/dist/phoenix/apache-phoenix-4.14.0-cdh5.13.2/parcels/ 下载好这三个文件 -rw-r--r-- 1 root root 364830720 7月 26 16:15 APACHE_PHOENIX-…

四元数,欧拉角,旋转矩阵相互转换

#include <TransForms3d/TransForms.h>/*---------------------------------------角度弧度转换----------------------------------------*/ /*** description: 角度转为弧度* param {double} angle 角度值* return 返回对应弧度值,一般在-3.14~3.14之间*/ double Trans…

node.js事件

// 1.普通事件的使用var EventEmitterrequire(events).EventEmitter;//声明事件对象 var eventnew EventEmitter();//实例化对象 event.on(some_event,function(){//注册事件并给事件取个别名some_eventconsole.log(这是一个自定义的事件); }); setTimeout(function(){//触发事…

Phoenix 关联hbase表历史数据

Phoenix 基本使用 进入Phoenix phoenix-sqlline.py 10.248.161.18:2181:/hbase 或者进入目录下执行 cd /opt/cloudera/parcels/APACHE_PHOENIX/bin 关联Hbase原有表 创建Hbase表&#xff0c;列簇为 cf1 , cf2 create phoenix_hbase_test,cf1,cf2 插入测试数据 put phoenix…

C++面试(二)

笔试题&#xff1a; Char * const p,char const *p,const char *p分别表示什么意思? 面向对象的三个特性是什么&#xff0c;有什么意义&#xff1f; 编程实现字符串连接函数 char * strcat(char *strDest,const char *strsrc);不用C/C字符串处理库函数。 ISO七层参考模型是什…

C++面试(三)

笔试题&#xff1a; 1 写出按一个字节的位对其方式的命令 #pragma pack(n) 2 写出UpdateData(BOOL values)函数的作用 3 写字符串拷贝函数&#xff0c;不能用系统的strcpy; Char *Strcpy(char *str, const char *Srcstr); 4 对两个有序的链表head1,head2&#xff0c;把他们合并…

Phoenix 关联映射 Hbase表 获取不到数据,upsert hbase 列名为16进制字符

创建Hbase表 create phoenix_hbase_test,cf1,cf2 put phoenix_hbase_test, key1,cf1:name,zhangsan put phoenix_hbase_test, key1,cf2:age,18 put phoenix_hbase_test, key2,cf1:name,lisi put phoenix_hbase_test, key2,cf2:age,26 put phoenix_hbase_test, key3,cf1:name,c…

node.js模块和包

概念&#xff1a;模块(Module)和包(Package)是Node.js最重要的支柱。开发一个具有一定规模的程序不可能只用一个文件&#xff0c;通常需要把各个功能拆分、分装、然后组合起来。模块正式为了实现这种方式而诞生&#xff0c;在浏览器JavaScript中&#xff0c;脚本模块的拆分和组…

C++面试/技巧(四)

我们老师那个时候就唧唧歪歪的说不要写精通……这了那了的。但是经过我的个人实践才发现&#xff0c;不管你写什么&#xff0c;别人问到你简历上你提到的东西时你能回答上来。别你写着精通某个技术&#xff0c;别人问你时你却说我不是很了解只是知道一点或干脆说不会&#xff0…

Ensure that config phoenix.schema.isNamespaceMappingEnabled is consistent on client and server

Phoenix链接异常&#xff0c;报错如下 0: jdbc:phoenix:xxx:2181:/hbase> Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Ensure that config phoenix.schema.isNamespaceMappingEnabled is consistent on client and server. (state43M10,code7…

node.js包管理器和代码调式

一、如何使用包管理器 Node.js包管理器&#xff0c;即npm是Node.js官方提供的包管理工具&#xff0c;它已经成了Node.js包的标准发布平台&#xff0c;用于Node.js包的发布、传播、依赖控制。(1)获取一个包 npm [install/i] [package_name] 例如安装express包&#xff1a;…

C++面试(五)

一. 笔试题. 有考关于SIZEOFC多态.虚函数内存泄露.把一串字符串.>0放左边,小于0的放右边.EXIT() 跟 _EXIT()的区别C怎样才能实现一个类只能创建一个实例有一串字符串.将其中的小写字母转为大写字母简述下进程和线程之间的区别. 二、面试题 根据简历过一遍.里面提到的相关技…

phoenix创建索引报错“ Mutable secondary indexes must have the hbase.regionserver.wal.codec property”

phoenix 创建hbase表索引时异常&#xff0c;报错如下 Error: ERROR 1029 (42Y88): Mutable secondary indexes must have the hbase.regionserver.wal.codec property set to org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec in the hbase-sites.xml of every …

node.js全局对象和全局变量

概念&#xff1a;所有属性都可以在程序的任何地方访问&#xff0c;即全局变量。在JavaScript中&#xff0c;通常window是全局对象&#xff0c;而Node.js的全局对象是global&#xff0c;所有全局变量都是global对象的属性&#xff0c;如&#xff1a;console、process等。一、全局…

软件项目开发流程

需求分析 1.相关系统分析员向用户初步了解需求&#xff0c;然后用相关的工具软件列出要开发的系统的大功能模块&#xff0c;每个大功能模块有哪些小功能模块&#xff0c;对于有些需求比较明确相关的界面时&#xff0c;在这一步里面可以初步定义好少量的界面。[1]2.系统分析员深…

node.js util全局变量和事件驱动events

一、util全局变量 1.util.inherits(constructor,superConstructor)此方法是一个实现对象间原型继承的函数。javaScript通过原型赋值来实现继承&#xff0c;细节可参考云哥JS高级视频(原型)。案例看 util/inherits.js定义了一个基础对象Base&#xff0c;原型方法为showName&…

Phoenix 关联查询异常 , MaxServerCacheSizeExceededException phoenix.query.maxServerCacheBytes

参数配置说明&#xff1a;http://phoenix.apache.org/tuning.html Join&#xff1a;http://phoenix.apache.org/joins.html 从设计角度来讲&#xff0c;尽可能的不使用phoenix进行关联查询&#xff0c;速度比直接根据条件查询慢很多很多 测试关联&#xff0c;异常如下 Error:…

面试时,你会问面试官哪些问题?

明天又要去参加一次面试。每次面试的时候&#xff0c;面试官都会在最后给面试者一些时间&#xff0c;来问问题。这是个非常好的机会&#xff0c;能按照自己的思路&#xff0c;来了解职位、技术、企业文化、福利待遇、企业状况和前景等情况&#xff0c;以弥补前面面试过程中没有…