尽管设置了超时,套接字接收仍挂起

时间:2020-04-12 22:28:37

标签: python sockets

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

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调用将永远阻塞。不幸的是,我无法创建一个最小的例子。我的最小服务器示例具有正确的行为。

1 个答案:

答案 0 :(得分:0)

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

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