我正在使用Python 2.7并正在使用一些遗留代码。它使用以下命令设置非阻塞模式的套接字:
self._socket.setblocking(0)
self._socket.settimeout(0)
我的问题是,在读取时,是什么决定套接字的超时?它是OS上TCP堆栈使用的默认值吗?如果是这样,在Linux上将如何改变?此外,写入超时是否与读取超时相同?
答案 0 :(得分:2)
根据documentation(强调我的):
在非阻止模式下,如果
recv()
呼叫未找到任何数据,或者如果asend()
调用无法立即处理数据,error
例外 被提出来了。
所以好像"超时"是一个瞬间检查。如果没有可用的数据或者在您调用该函数时无法完全写入,则会收到异常。
答案 1 :(得分:2)
以下是socket.settimeout
socket._socketobject实例的settimeout(...)方法 的setTimeout(超时)
设置套接字操作的超时。 'timeout'可以是浮点数, 在几秒钟内给出,或者无。将超时设置为无禁用 超时功能相当于
setblocking(1)
。 将超时设置为零与setblocking(0)
相同。
所以我不确定为什么setblocking(0)
和settimeout(0)
两者都在上面完成。这意味着如果没有可用数据,read
会立即返回EAGAIN
或EWOULDBLOCK
。当另一端关闭连接时,read
将返回值0
。
读取超时仅在“阻塞”状态下有意义,在超过超时的时间过后且没有数据要读取时,读取应返回EAGAIN
或EWOULDBLOCK
。
一般来说,这不会影响write
超时。当你将socket设置为非阻塞并且'write buffers'已经满了(这很少会发生,除非有一个相当'慢'的接收器)并且如果write
可能阻塞,它应该立即返回{ {1}}或EAGAIN
然后在应用程序上有责任确保再次发出EWOULDBLOCK
。