前段时间写的程序跑了一段时间,发现当 socket send/receive data 一直在阻塞时并没有处理 timeout。
在 Unix 上边实现 socket timeout, 可以有三种方法:
1. 如果 socket 实现功能简单, 可以用Alarm signal 来处理 timeout
2. 用 Select()方法设置。此方法可以监听 socket 的状态,同时可以设置 Timeout 。
3. 用 setsockopt() 方法设置。此方法可以设置某一 socket 的属性,如每次接的数据大小,等等。它就含有 SO_RCVTIMEO 和 SO_SNDTIMEO 两种属性来设置接收/发送的 Timeout 。但是此方法只有部分系统支持, 其中 Solaris 就不支持。
我的程序就是跑在Solaris上 :(, 最后用第二种方法实现了。
在 Unix 上边实现 socket timeout, 可以有三种方法:
1. 如果 socket 实现功能简单, 可以用Alarm signal 来处理 timeout
2. 用 Select()方法设置。此方法可以监听 socket 的状态,同时可以设置 Timeout 。
3. 用 setsockopt() 方法设置。此方法可以设置某一 socket 的属性,如每次接的数据大小,等等。它就含有 SO_RCVTIMEO 和 SO_SNDTIMEO 两种属性来设置接收/发送的 Timeout 。但是此方法只有部分系统支持, 其中 Solaris 就不支持。
我的程序就是跑在Solaris上 :(, 最后用第二种方法实现了。
本文介绍了在Unix系统中实现socket超时处理的三种方法:使用Alarm信号、Select方法及setsockopt方法,并分享了作者在Solaris系统上最终采用Select方法解决问题的经历。
1万+

被折叠的 条评论
为什么被折叠?



