首页 > 代码库 > bind出现Address already in use
bind出现Address already in use
如果先ctrl+c结束服务器端程序的话,再次启动服务器就会出现Address already in use这个错误,或者你的程序在正常关闭服务器端socket后还是有这个问题
bind 普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。
等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT 状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。
但是对于LISTEN 端口
即使你设置了 SO_REUSEADDR选项,对于LISTEN状态的端口,也是不能重复监听的
如何解决呢?
例如要关闭22号端口:
$ netstat -anp | grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1666/sshd
# -a 显示所有活动的TCP连接,以及正在监听的TCP和UDP端口
# -n 以数字形式表示地址和端口号,不试图去解析其名称(number)
# -p 列出与端口监听或连接相关的进程(有个地方需要注意,下面会提到)(pid)
知道了22号端口对应的进程ID 1666,只要:
$ kill 1666
即可。