在Python 2.6中正确关闭套接字的方法是什么?

3 投票
1 回答
2677 浏览
提问于 2025-04-15 22:20

我有一个简单的服务器和客户端,我用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)

这段代码会告诉操作系统,你希望允许多个套接字绑定。

撰写回答