博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket I/O上设置超时的三种方法及其比较
阅读量:4142 次
发布时间:2019-05-25

本文共 931 字,大约阅读时间需要 3 分钟。

        在socket I/O上设置超时, 一般有三种方法, 下面我们来聊聊。

       1.  select/poll

        这是最好的方法, 也是最为推荐的, 对于send/sendto和recv/recvfrom, 都可以用select和poll来设置超时时间, 这种情况下, 一般要把socket先设置为临时的非阻塞socket.  在某次面试中, 面试官还让我现场写select函数的相关代码, 最终顺利完成。 我首先推荐select/poll.

        当然, 以我写代码的实际经验来看, poll比select更简洁, select中那些fdset的设置和清除, 怪烦人的。

        2. alarm

        用alarm函数终端I/O操作, 虽然可行, 但我认为是比较鸡肋的。 在多线程中, 会有不少隐患。 虽然在Stevens的书中也介绍了这种用法, 但作为吃瓜群众, 我们只需要了解alarm实现超时的原理即可, 大可不必在实际中用这种鸡肋的东西。 至少, 我在实际代码中, 是没有看到过的。

        不过, alarm函数至少有一个用途, 那就是如果你去参加笔试或者面试, 你至少比别人多了解了一种方式, 这种鸡肋的东西, 虽然并无实际用途, 但可以增加人逼格。

        鸡肋鸡肋, 食之无味, 弃之可惜。

        3.  SO_SNDTIMEO和SO_RCVTIMEO

          这连个东西, 是针对某一socket整体生效的, 我在实际代码中没有见过这个东西用法, 也用的少。 同上面的alarm, 多了解一点, 也许所谓的逼格就更高一点。

        还有个问题, 如上只是说了基本的I/O,  也就是读和写, 那么对于connect操作, 会怎样呢?

        1.  当然可以用select/poll为connect设置超时, 这里就要求临时转为非阻塞socket了。 我在某公司技术终面的时候, 被问到这个题, 顺利答出。 不过那时主要实在Windows上玩。

        2.  alarm用于connect的连接? 虽然可以, 但不推荐, 实际也很少见。

        3.  SO_SNDTIMEO和SO_RCVTIMEO ?  oh my god,  这两个东西是为写和读设计的, 跟connect有毛关系呢?

         好了, 不多说。 超时设置, 首推select/poll

转载地址:http://pnwti.baihongyu.com/

你可能感兴趣的文章
组队总结
查看>>
TitledBorder 设置JPanel边框
查看>>
DBCP——开源组件 的使用
查看>>
抓包工具
查看>>
海量数据相似度计算之simhash和海明距离
查看>>
DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
查看>>
DeepLearning tutorial(6)易用的深度学习框架Keras简介
查看>>
DeepLearning tutorial(7)深度学习框架Keras的使用-进阶
查看>>
流形学习-高维数据的降维与可视化
查看>>
Python-OpenCV人脸检测(代码)
查看>>
python+opencv之视频人脸识别
查看>>
人脸识别(OpenCV+Python)
查看>>
6个强大的AngularJS扩展应用
查看>>
网站用户登录系统设计——jsGen实现版
查看>>
第三方SDK:讯飞语音听写
查看>>
第三方SDK:JPush SDK Eclipse
查看>>
第三方开源库:imageLoader的使用
查看>>
自定义控件:飞入飞出的效果
查看>>
自定义控件:动态获取控件的高
查看>>
第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高
查看>>