我有一个关于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)
创建的套接字将绑定到端口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似乎无法解决此问题谢谢!
发布于 2013-09-18 03:57:26
这是我测试过的完整代码,绝对不会给出“地址已在使用”的错误。您可以将其保存在一个文件中,并从要提供服务的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
发布于 2016-02-12 21:27:57
如果使用TCPServer
或SimpleHTTPServer
遇到问题,请覆盖SocketServer.TCPServer.allow_reuse_address
(Python2.7.x)或socketserver.TCPServer.allow_reuse_address
(Python3.x)属性
class MyServer(SocketServer.TCPServer):
allow_reuse_address = True
server = MyServer((HOST, PORT), MyHandler)
server.serve_forever()
发布于 2014-11-04 06:02:37
绑定前需要设置allow_reuse_address。运行以下代码片段,而不是SimpleHTTPServer:
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()
这会阻止服务器在我们有机会设置标志之前进行绑定。
https://stackoverflow.com/questions/6380057
复制相似问题