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