首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:绑定套接字:“地址已在使用中”

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

Stack Overflow用户
提问于 2011-06-17 08:12:11
回答 9查看 247.8K关注 0票数 93

我有一个关于TCP/IP网络上的客户端套接字的问题。假设我使用

代码语言:javascript
复制
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)

创建的套接字将绑定到端口5555。问题是在结束连接后

代码语言:javascript
复制
comSocket.shutdown(1)
comSocket.close()

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

代码语言:javascript
复制
[ERROR] Address already in use

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

代码语言:javascript
复制
comSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

setsockopt似乎无法解决此问题谢谢!

EN

回答 9

Stack Overflow用户

发布于 2013-09-18 03:57:26

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

代码语言:javascript
复制
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
票数 31
EN

Stack Overflow用户

发布于 2016-02-12 21:27:57

如果使用TCPServerSimpleHTTPServer遇到问题,请覆盖SocketServer.TCPServer.allow_reuse_address (Python2.7.x)或socketserver.TCPServer.allow_reuse_address (Python3.x)属性

代码语言:javascript
复制
class MyServer(SocketServer.TCPServer):
    allow_reuse_address = True

server = MyServer((HOST, PORT), MyHandler)
server.serve_forever()
票数 14
EN

Stack Overflow用户

发布于 2014-11-04 06:02:37

绑定前需要设置allow_reuse_address。运行以下代码片段,而不是SimpleHTTPServer:

代码语言:javascript
复制
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler, bind_and_activate=False)
httpd.allow_reuse_address = True
httpd.server_bind()
httpd.server_activate()
httpd.serve_forever()

这会阻止服务器在我们有机会设置标志之前进行绑定。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6380057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档