socket 的关闭

xiaoxiao2021-02-28  65

用python在写一个东西,用socket监听一个端口,但是重启的时候总是会报错

[ERROR] Address already in use

检查了一下端口

netstat -an | grep 9200 tcp4 0 0 127.0.0.1.9200 127.0.0.1.60481 TIME_WAIT

socket close 之后端口还是会被占用,这个是linux底层的机制,就是防止丢包。 在我的应用场景里面其实不怕丢包,所以把socket定义为可重用就行

http://www.unixguide.net/network/socketfaq/4.5.shtml

What exactly does SO_REUSEADDR do? This socket option tells the kernel that even if this port is busy (in the TIME_WAIT state), go ahead and reuse it anyway. If it is busy, but with another state, you will still get an address already in use error. It is useful if your server has been shut down, and then restarted right away while sockets are still active on its port. You should be aware that if any unexpected data comes in, it may confuse your server, but while this is possible, it is not likely. It has been pointed out that "A socket is a 5 tuple (proto, local addr, local port, remote addr, remote port). SO_REUSEADDR just says that you can reuse local addresses. The 5 tuple still must be unique!" by Michael Hunter (mphunter@qnx.com). This is true, and this is why it is very unlikely that unexpected data will ever be seen by your server. The danger is that such a 5 tuple is still floating around on the net, and while it is bouncing around, a new connection from the same client, on the same system, happens to get the same remote port. This is explained by Richard Stevens in ``2.7 Please explain the TIME_WAIT state.''.

实际代码大概是这样:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', Command.port)) s.listen(5) while True: conn, address = s.accept() data = conn.recv(1024) if not data: pass else: pass
转载请注明原文地址: https://www.6miu.com/read-83189.html

最新回复(0)