简体   繁体   English

Python异步套接字,端口无法重用

[英]Python asyncore socket, port unable to reuse

This is my server code, I have already written self.set_reuse_addr() : 这是我的服务器代码,我已经写了self.set_reuse_addr()

class ImageServer(asyncore.dispatcher):
    def __init__(self,port):
        asyncore.dispatcher.__init__(self)
        self.client = None      
        self.port = port 
        self.clientSocket = None
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind(("192.168.11.2",self.port))
        self.listen(20)
        print "[*] Listening ..."

still got this error , port reuse 仍然出现此错误,端口重用

self.bind(("192.168.11.2",self.port))

File "/usr/lib/python2.7/asyncore.py", line 342, in bind
return self.socket.bind(addr)

File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)

socket.error: [Errno 98] Address already in use

Is there anyone know how to fix this problem? 有谁知道如何解决这个问题?

With SO_REUSEADDR : 使用SO_REUSEADDR

  1. ALLOW binding to 0.0.0.0:port AND 192.168.11.2:port 允许绑定到0.0.0.0:port192.168.11.2:port
  2. ALLOW binding to a socket in TIME_WAIT BUT you can't establish a connection to the same destination addr:port that the previous TIME_WAIT socket was. 允许绑定到TIME_WAIT中的套接字,但是您无法建立到与先前TIME_WAIT套接字相同的目标addr:port的连接。

SO_REUSEPORT will allow to do that (reuse the addr:port for multiple processes) with the caveat that a client CONNECT might result in EADDRINUSE since it can't distinguish between old socket info and new one. SO_REUSEPORT将允许这样做(对于多个进程重复使用addr:port),但要注意的是,客户端CONNECT可能导致EADDRINUSE,因为它无法区分旧套接字信息和新套接字信息。

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM