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。
我在这里缺少什么?为什么套接字没有正确关闭?
编辑:这不是如何关闭被杀死的程序打开的套接字的重复项?因为在我的例子中,套接字被优雅地关闭,而不是那个问题。
这是因为套接字处于 TCP TIME-WAIT 状态,这是端点在发送最后一个 ack 后所处的状态,但在此期间,如果 ack 丢失,另一端可能会重新传输其最后一个请求。(正如tfb所说)。
为了解决这个问题,需要在套接字出价之前插入以下代码:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3894 次 |
| 最近记录: |