Python套接字没有真正关闭

Ami*_*old 1 python sockets linux python-3.x

我的 main 函数中有以下代码:

def main():
    server = socket.socket();
    server.bind((address, port))
    server.listen(1)

    sock, addr = server.accept()
    try:
        while True:
            message = sock.recv(buffer_size)
            # Do some stuff...
            sock.send(answer)
    except KeyboardInterrupt:
        pass
    finally:
        sock.close()
        server.close()
Run Code Online (Sandbox Code Playgroud)

该程序运行得非常好,一切都很完美,直到我决定结束它。

Ctrl-C我使用(或^C)结束我的程序。异常KeyboardInterrupt得到正确处理并且到达了finally块,但是由于某种原因,当我再次运行程序时,我得到了OSError有关端口正在使用的信息,并且我必须等待大约1分钟,直到套接字关闭才可以重新运行代码。如果这很重要的话,我使用的是Linux。

我在这里缺少什么?为什么套接字没有正确关闭?

编辑:这不是如何关闭被杀死的程序打开的套接字的重复项?因为在我的例子中,套接字被优雅地关闭,而不是那个问题。

Ami*_*old 6

这是因为套接字处于 TCP TIME-WAIT 状态,这是端点在发送最后一个 ack 后所处的状态,但在此期间,如果 ack 丢失,另一端可能会重新传输其最后一个请求。(正如tfb所说)。

为了解决这个问题,需要在套接字出价之前插入以下代码:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)