套接字处于阻塞模式

时间:2012-01-21 11:27:20

标签: sockets network-programming timeout blocking nonblocking

你认为使用阻塞套接字 select()是一个好主意还是更好的使用超时 SO_SNDTIMEO / SO_RCVTIMEO

(我在Linux下,socket是在SOCK_STREAM上设置的)

第一种解决方案的优势在于它可以适用于任何类型的套接字(阻塞和/或非阻塞状态)

1 个答案:

答案 0 :(得分:1)

假设您想要select() / read() / write() /等跟进send()。当它返回准备条件时,如果你的确需要非常小心文件描述符处于阻塞模式。对于读取,您必须确保在获得读取就绪指示后才读取一次,因为第二个可能会阻塞。对于写入,它可能更糟糕:我想可能有一些模糊的条件,即select()报告套接字已准备就绪,但发生了某些事情,并且在write()到它时它已经不再准备好了。即使这最后一个假设过于悲观,我也会认为这个解决方案是不可维护的,也是不好的做法。

考虑到使用fcntl()将文件描述符动态地从阻塞切换到非阻塞并返回并不困难,您是否因此关注与阻塞套接字兼容?只需将它们更改为非阻塞。