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

来源:互联网 发布:上海软件中心怎么样 编辑:程序博客网 时间:2024/05/22 13:13

        在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







阅读全文
0 0
原创粉丝点击