【问题标题】:Socket recv hangs despite settimeout尽管设置超时,套接字 recv 仍挂起
【发布时间】:2020-04-12 22:28:37
【问题描述】:

我正在使用内置的套接字模块来创建客户端套接字。

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
sock.settimeout(30.0)
sock.connect((host, port))
...

def recvall(sock, count):
    buf = io.BytesIO()
    while count:
        newbuf = sock.recv(count)
        buf.write(newbuf)
        count -= len(newbuf)
    return buf.getvalue()

msg = recvall(sock, 1024)

有时,尽管设置了超时,但当服务器进程崩溃时,recv 调用将永远阻塞。不幸的是,我无法创建一个最小的示例;我使用最小服务器的示例具有正确的行为。

【问题讨论】:

  • 那么你的例子不是最小的。如果问题出在崩溃的服务器上,那么一个最小的示例应该模拟崩溃的服务器。
  • sock.recv 是否在一个循环中,如果超时,代码将无法中断?喜欢stackoverflow.com/questions/10998715/…
  • mkrieger:我已经尝试过使用崩溃服务器的最小示例。我怀疑我的例子没有以正确的方式崩溃。确实 recv 在循环中。 D'oh,这可能是答案——很好的建议!现在检查。
  • 这完全是同一个问题——如果len(newbuf)为0,则存在无限循环。

标签: python sockets


【解决方案1】:

mkrieger1 的评论解决了问题。 recv 调用返回空字符串,导致无限循环。

if not newbuf:
    raise socket.error("no data")

【讨论】:

  • 那么你的报告很差,也许是观察力差。无限循环与永远阻塞不同。
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
相关资源
最近更新 更多