socket 的关闭

来源:互联网 发布:java 中接口interface 编辑:程序博客网 时间:2024/06/03 10:21

用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
原创粉丝点击