Python:绑定套接字:“地址已在使用中”

新手上路,请多包涵

我对 TCP/IP 网络上的客户端套接字有疑问。假设我用

try:

    comSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

except socket.error, msg:

    sys.stderr.write("[ERROR] %s\n" % msg[1])
    sys.exit(1)

try:
    comSocket.bind(('', 5555))

    comSocket.connect()

except socket.error, msg:

    sys.stderr.write("[ERROR] %s\n" % msg[1])

    sys.exit(2)

创建的socket会绑定到5555端口,问题是结束连接后

comSocket.shutdown(1)
comSocket.close()

使用 wireshark,我看到套接字从两侧用 FIN、ACK 和 ACK 关闭,我无法再次使用该端口。我收到以下错误:

 [ERROR] Address already in use

我想知道如何立即清除端口,以便下次我仍然可以使用同一个端口。

 comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

setsockopt 好像不能解决问题 谢谢!

原文由 Tu Hoang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 303
2 个回答

在绑定套接字之前尝试使用 SO_REUSEADDR 套接字选项。

 comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

编辑: 我看到你仍然有这个问题。有一种情况 SO_REUSEADDR 不起作用。如果您尝试绑定套接字并重新连接到相同的目的地(启用 SO_REUSEADDR ),那么 TIME_WAIT 仍然有效。但是,它将允许您连接到不同的主机:端口。

我想到了几个解决方案。您可以继续重试,直到您再次获得连接。或者,如果客户端启动套接字(而不是服务器)的关闭,那么它应该神奇地工作。

原文由 Bryan 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是我测试过的完整代码,绝对不会给我“地址已在使用”错误。您可以将其保存在一个文件中,并从您要提供的 HTML 文件的基目录中运行该文件。此外,您可以在启动服务器之前以编程方式更改目录

import socket
import SimpleHTTPServer
import SocketServer
# import os # uncomment if you want to change directories within the program

PORT = 8000

# Absolutely essential!  This ensures that socket resuse is setup BEFORE
# it is bound.  Will avoid the TIME_WAIT issue

class MyTCPServer(SocketServer.TCPServer):
    def server_bind(self):
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(self.server_address)

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = MyTCPServer(("", PORT), Handler)

# os.chdir("/My/Webpages/Live/here.html")

httpd.serve_forever()

# httpd.shutdown() # If you want to programmatically shut off the server

原文由 user2543899 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏