完成了socket编程的阻塞与非阻塞,接下俩就要处理前面讲过的关于超时处理的内容了。

select函数我们可以看下接口手册
如下代码:

FD_ZERO(&set);              //文件句柄置空FD_SET(sock, &set);        //把这个sock加入到这个文件句柄当中timeval tm;tm.tv_sec = 0;tm.tv_usec = timeoutms * 1000;if (select(sock + 1, 0, &set, 0, &tm) <= 0)                            //监听这个文件序列是否有可读可写{printf("connect %s:%d failed:%s\n", ip, port, strerror(errno));printf("connect timeout or error!\n");return false;}

概述:
对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去。可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去。

对于非阻塞的套接字立即返回.超时对于阻塞的套接字更有用.

在涉及套接字的I/O操作上设置超时的方法有三种:
    1:调用alarm,它在指定的超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。
    2:在select中阻塞等待I/O(select有内置的时间限制),依次代替直接阻塞在read或write调用上。(linux2.6以后的内核也可以使用epoll的epoll_wait)
    3:使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法的问题在于并非所有的实现都支持这两个套接字选项。

上述这三个技术都适用于输入和输出操作(read、write,及其变体recv/send, readv/writev, recvfrom,sendto)。不过我们也期待可以用于connect的技术,因为TCP内置的connect超时相当长(典型值为75秒),而我们在写服务器程序的时候,也不会希望一个连接的建立需要花费这么长时间。select可用来在connect上设置超时的先决条件是相应的套接字是非阻塞的,而那两个套接字选项对connect并不适用;同时也应当指出,前两个技术适用于任何描述符,而第三个技术仅仅适用于套接字描述符。
这里只是测试了下设置套接字超时这种方式.

C++socket编程(六):6.2 通过select实现超时处理相关推荐

  1. 深入研究socket编程(3)——使用select函数编写客户端和服务器

    http://blog.csdn.net/chenxun_2010/article/details/50488394 首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代 ...

  2. linux网络编程之socket编程(六)

    经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:"真爱生活,珍惜生命",好了,言归正传. ...

  3. Socket编程实践(9) --套接字IO超时设置方法

    引:超时设置3种方案 1. alarm超时设置方法 //代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) {return ; }signal(SIG ...

  4. socket 编程篇六之IPO多路复用-select poll epoll

    http://blog.csdn.net/woxiaohahaa/article/details/51498951 文章参考自:http://blog.csdn.net/tennysonsky/art ...

  5. socket编程的select模型

    在掌握了socket相关的一些函数后,套接字编程还是比较简单的,日常工作中碰到很多的问题就是客户端/服务器模型中,如何让服务端在同一时间高效的处理多个客户端的连接,我们的处理办法可能会是在服务端不停的 ...

  6. SOCKET编程中,select()函数的作用

    SOCKET编程中,select()函数的作用Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accep ...

  7. Socket编程知识必学/SELECT 编程

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...

  8. Socket编程实践(10) --select的限制与poll的使用

    select的限制 用select实现的并发服务器,能达到的并发数一般受两方面限制: 1)一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n(number)来调整或 ...

  9. js监听select值变化_网络编程——C++实现socket通信(TCP)高并发之select模式

    相关函数: 服务端: socket() bind() listen() FD_ZERO()等辅助函数 select() 高并发select模式 accept() read() 或 recv()等 wr ...

最新文章

  1. 贝塞尔曲线与CAShapeLayer的关系以及Stroke动画
  2. Objective-C 编码规范
  3. bzoj1007题解
  4. VTK:vtkCubeAxesActor用法实战
  5. jemter在linux上怎么安装_【JMeter之一】在linux系统下安装jmeter
  6. 设计灵感|C4D卡通角色设计作品,你想要的模型集设都有
  7. Django 缓存、序列化、信号
  8. prometheus linux下载_Prometheus笔记
  9. 3D开发-AR.js Nginx HTTPS服务搭建
  10. 重置kubernetes集群
  11. Nachos project1 领悟
  12. 【机器学习】机器学习公共数据集整理
  13. 人脸识别中怎么区分人脸和照片
  14. 自定义view,仿微信、支付宝密码输入控件的源码实现
  15. win10 64位注册TeeChart8.ocx
  16. 如何使用SQL批量替换数据库特定字段中部分特定数据
  17. Linux Shell脚本:探测同网段主机及对应MAC地址
  18. (Java)socket网络编程及处理socket粘包拆包问题
  19. android调用在线天气服务,android通过google api获取天气信息示例
  20. python pyqt5图片(QPixmap)和opencv图片数据结构相互转换

热门文章

  1. Android 仿微信朋友圈发表图片拖拽和删除功能
  2. Sublime Text 2安装汉化破解、插件包安装教程
  3. Linux的watch命令 -- 实时监测命令的运行结果
  4. 58 - 算法 -分治问题 - 循环 二分查找 OpenJudge 百练 4143和为给定数
  5. python变量域名_想尝试使用python进行域名分析,可是没有接触过python,想请教请教。...
  6. python oop编程_23 Python - 面向对象编程OOP
  7. 百万数据php7取出循环_用php处理百万级以上的数据
  8. python 文件下载服务器异常_python 从远程服务器下载日志文件的程序
  9. sql limit不接具体数字_SQL汇总函数和分组函数
  10. linux分配端口未抢占端口,Linux命令之awk:基础知识(一)