Python socket.recv()何时引发异常?

Python socket.recv()何时引发异常?,python,sockets,tcp,blocking,recv,Python,Sockets,Tcp,Blocking,Recv,我使用的是阻塞套接字,我对recv()非常困惑,因为我没有找到任何关于它的文档。官方的似乎只限于我。另一件让我困惑的事情是,互联网上(以及这个网站上)的人说,它不会因为阻止套接字而引发任何异常,但它只是一直在等待。如果我粗暴地关闭服务器,它会抛出错误号10054(socket.error)。简单地说,recv将在底层套接字操作失败时抛出异常。问题在于,这取决于您所使用的操作系统。在这里我可以猜到你是在Windows上,因为10054是一个用于连接重置的。幸运的是,套接字操作失败的时间和原因在操作

我使用的是阻塞套接字,我对recv()非常困惑,因为我没有找到任何关于它的文档。官方的似乎只限于我。另一件让我困惑的事情是,互联网上(以及这个网站上)的人说,它不会因为阻止套接字而引发任何异常,但它只是一直在等待。如果我粗暴地关闭服务器,它会抛出错误号10054(socket.error)。

简单地说,
recv
将在底层套接字操作失败时抛出异常。问题在于,这取决于您所使用的操作系统。在这里我可以猜到你是在Windows上,因为10054是一个用于连接重置的。幸运的是,套接字操作失败的时间和原因在操作系统之间大致一致(查看详细信息),python有一个可移植的解决方案来识别错误:

import errno
...
if err == errno.ECONNRESET :
    print "connection reset"

如果连接被终止,它显然不能等待。不知怎的,它必须通知你这件事。这并不奇怪。那么在哪种情况下它会返回一个空字符串?它什么时候会一直等待?@MarcoFazio我不是100%确定,但我认为它会等到收到数据、发生错误或连接正常关闭。空字符串应该只有在连接正常关闭时才出现,但是您应该测试它以确保它的正确性。谢谢。如果我用shutdown()关闭套接字,它将返回一个空字符串。我自己更正。出于某种原因,它曾经返回一个空字符串,但现在它不工作了。