socket I/O上设置超时的三种方法及其比较

本文探讨了三种在socket I/O上设置超时的方法:select/poll(推荐)、alarm(鸡肋)和SO_SNDTIMEO/SO_RCVTIMEO(不常用)。对于send/sendto和recv/recvfrom,select/poll是最佳选择,特别是在多线程环境中。而对于connect操作,同样可以通过select/poll实现超时,而alarm和SO_SNDTIMEO/SO_RCVTIMEO并不适用。
摘要由CSDN通过智能技术生成

        在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整体生效的, 我在实际代码中没有见过这个东西用法&

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值