或者你会发现,你在编写程序时,不注意,或者一个很不起眼的写法,可它会给你带来很无奈的错误,让你很久才会发现,原来这个问题是这么回事。

1、常见的写法问题

这个问题看似不怎么,根据原理select会重置参数,所以fd这个参数在调用完select之后会被更改,所以下次执行select必须重新设置fd,就是说要将 FD_ZERO(&fd); FD_SET( skt, &fd);放在do,while里面,即每次select都要先初始化fdset;

2、另外做超时时可能会出现115错误,linux下面使用常见错误,这个问题我也遇到过,发现是一个很犀利的写法

select最后一个参数是timeval指针,这个指针也需要和fd一样,在每次select都要重新设置,如下面代码

这是我在写一个超时计算代码时发现的问题,有一个函数发送数据,需要在指定的时间内发送完,如果超过时间就返回真实发送长度。

那么,你可能需要在多次send之间来计算哪些是超时的,假如我传一个30秒的超时,你不能只select一次,将时间设置为超时,因为这样有问题,就是在第一次select成功之后,在send的时候可能没有发送完所有数据,还要不断的发送,在再次发送时超时就不好计算了,因为你上次select用的30秒,把时间用光了,并且你也不知道select到底用了多少时间。

我们可以将30秒划分为几个小的秒单位,比较每次select用1秒的时间,这样每次select或send超时都计1秒时间 ,在不断的累加就可以了。刚好在累加的时候如果你把timeval参数写在 do,while外面

那么只有第一次是正常的,第二次timeval变成 tv.sec = 0,tv.usec = 0;这样会造成select超时计算失误,因为tv值0表示不等待直接返回,假如此时发送缓冲已满,立马返回超时,这样你累加1秒时间就不准。

我当时测试 的是,设置30秒,结果只等 了一秒就返回超时了,打印日志显示select返回0确实是有30次,可是除了第一次有延迟,后面的基本上是同时显示出来的,就说明后面select根本没有等待,后来发现这个timeval被置0了,我呢个去,不发现不知道,一发现太肯我了。

除声明外,

跑步客文章均为原创,转载请以链接形式标明本文地址

本文地址:   http://www.paobuke.com/develop/c/pbk1371.html

linux select 错误码,linux下面select返回115错误相关推荐

  1. winSCP:无权访问。 错误码:3 服务器返回的错误消息:Permission denied解决方案

    winscp可以利用sftp协议对linux服务器就行连接,如果是利用普通用户进行登陆的话,上传文件的过程中会出现一些permission denied的提示,并且错误的返回码是3,下面说明下解决方法 ...

  2. 微信退款返回58 linux,小程序微信支付申请退款返回cUrl错误,错误码:58

    2019-04-03 15:15:29 如何看待微信公开课小程序热门讨论「小程序微信支付申请退款返回cUrl错误,错误码:58」 摘要:小程序微信支付申请退款返回cUrl错误,错误码:58 展开:调用 ...

  3. Linux内核错误码和错误指针

    1.IS_ERR_VALUE Linux内核中,最大错误码的值为MAX_ERRNO,错误码为负数,负数以补码的形式存储.Arm32位系统错误码的补码范围为0xFFFFF000 - 0xFFFFFFFF ...

  4. Linux常用错误码--errno-base.h

    经常会需要用到错误码,但是它具体的值 是什么呢,往往不太清楚,所以在使用的时候非常不舒服,下面把linux平台下常用的错误码列了下. 我是Fedora12系统,找到的定义文件是:/usr/includ ...

  5. 常见HTTP请求错误码,403、502等错误意思大全

    在网站运行中,我们经常会碰到各种安装提示错误,下面给大家汇总了一些常见HTTP请求错误码都是什么意思: 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - ...

  6. php获取prepay_id时报错,微信支付获取prepay_id返回签名错误,官方demo中的签名方法MD5验证有问题...

    引用官方V3微信支付PHP版的demo做的改动,在获取prepay_id发现总是返回签名错误,经与腾讯官方的"微信公众平台支付接口调试工具"对比发现MD5不一样,找到demo中代码 ...

  7. linux c 错误码大全及错误的捕获

    经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因.这个时候使用 ...

  8. linux控制器错误码,ubuntu – 不频繁的输入/输出错误 – Linux服务器

    偶尔,我们会在其中一个磁盘上遇到输入/输出错误. 我们的服务器(DELL PowerEdge R720,Ubuntu 14.04)使用Perc H710 Raid控制器,产生错误的磁盘是Dell 60 ...

  9. Oracle数据库错误码1502解决,SQL的1502错误处理

    有关错误的中文意 [Error Code: 1502, SQL State: 72000] ORA-01502: 索引 'UserXXX.XPKTAB_NAME' 或这类索引的分区处于不可用状态. 对 ...

最新文章

  1. 有序单链表的归并算法
  2. 根据当前时间获取本周,下周,上周日期
  3. 路径问题(如何正确写出文件路径)
  4. webpack超详细配置
  5. Oracle建立全文索引详解
  6. python基础教程zip密码_python基础教程Python实现加密的RAR文件解压的方法(密码已知)...
  7. sdut 最长公共子序列问题
  8. 从容 IT 人生路,开发工具伴我行——“葡萄城 30 周年”征文
  9. 硬件基础知识----(20)KVM 深入理解
  10. 8年前端开发的知识点沉淀(不知道会多少字,一直写下去吧...)
  11. jsp加载常量的探讨
  12. android 之反编译
  13. SQL中WHERE子句介绍
  14. Linux常用shell脚本
  15. 智能优化算法:平衡优化器算法 -附代码
  16. (转)用Javascript获取页面元素的位置
  17. 城市大数据及开放数据索引
  18. 勘测定界坐标导入cad
  19. mongodb 建立索引提示异常:WiredTigerIndex::insert: key too large to index, failing 1483
  20. 【学习OpenCV】给轮廓画出矩形和圆形边界

热门文章

  1. 【博学谷学习记录】超强总结,用心分享 | JavaSE入门基础知识总结
  2. Redis 面试题!精华!收藏一波 !
  3. arcsinx,arctanx反函数求导
  4. 三网合一我们该做些什么?
  5. RT-thread相关教程汇总
  6. 简单工厂之Delphi实现
  7. XP下让系统自动登录
  8. 深度学习环境搭建之七_Ubuntu安装微信、QQ、百度网盘
  9. 『状态』驱动的世界:ReactiveCocoa
  10. ERP管理系统规划四大注意事项