猿问

如果在超时之前没有收到任何数据,Python的socket.recv()对于非阻塞套接字返回什么?

基本上,我已经在几个地方阅读过,socket.recv()将返回它可以读取的内容,或者是一个空字符串,表示另一端已关闭(官方文档甚至没有提到关闭连接后返回的内容...大!)。对于阻塞套接字来说,这一切都很好,很花哨,因为我们知道recv()只有在实际有东西要接收时才返回,所以当它返回一个空字符串时,必须表示另一端已关闭连接,对吗?

好的,很好,但是当我的套接字未阻塞时会发生什么?我进行了一些搜索(可能还不够,谁知道?),并且不知道如何知道何时使用非阻塞套接字关闭了另一端。似乎没有任何方法或属性可以告诉我们这一点,将的返回值recv()与空字符串进行比较似乎绝对没有用……只是我有这个问题吗?

举个简单的例子,假设我的套接字的超时设置为1.2342342(无论您在这里喜欢什么非负数)秒,然后我都打电话给socket.recv(1024),但是另一端在那段1.2342342的时间内没有发送任何东西。该recv()呼叫将返回一个空字符串,并且我不知道该连接是否仍处于站立状态...


慕标5832272
浏览 989回答 3
3回答

qq_遁去的一_1

很简单:如果recv()返回0个字节,则返回0。您将不会再通过此连接收到任何数据。曾经 您仍然可以发送。这意味着,如果没有可用数据但连接仍然有效(另一端可能发送),则非阻塞套接字必须引发异常(可能与系统有关)。
随时随地看视频慕课网APP

相关分类

Python
我要回答