首页 > 代码库 > 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
即可。