在Python 2.6中正确关闭套接字的方法是什么?
我有一个简单的服务器和客户端,我用netcat这个工具来测试服务器。如果我在客户端退出之前就停止了服务器,过一会儿再想启动服务器就会遇到一个错误,提示:
“[Errno 98] 地址已经在使用中”
但是如果我先关闭客户端,然后再停止服务器,就不会出现这个问题。
我的服务器套接字是这样工作的:
try:
s=socket
s.bind(..)
s.listen(1)
conn,addr=s.accept()
finally:
conn.close()
s.close()
我感觉服务器没有正确关闭套接字,但我不知道该怎么解决这个问题。
1 个回答
9
你关闭套接字(socket)做得很好。不过,关闭后套接字在接下来的几分钟里仍然会占用一些资源,这样如果远端漏掉了某个数据包,就可以重新发送这个数据包。
在你调用 bind
之前,可以先调用以下代码来解决这个问题:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
这段代码会告诉操作系统,你希望允许多个套接字绑定。