bind: Address already in use
解决办法:
1.输入命令: ps -aux
查找当前程序所在进程号:我的问题程序:have_a_try_SocketCommunication;进程号:6230 6231
root 6150 0.0 0.0 0 0 ? S 13:59 0:00 [kworker/0:1]
root 6195 0.0 0.0 0 0 ? S 14:04 0:00 [kworker/0:0]
root 6222 0.0 0.0 0 0 ? S 14:09 0:00 [kworker/0:2]
root 6230 0.0 0.0 1872 56 pts/0 S 14:13 0:00 ./have_a_try_SocketCommunication
root 6231 0.0 0.0 1872 56 pts/0 S 14:13 0:00 ./have_a_try_SocketCommunication
2.杀掉进程,输入命令: kill 6230 6231
再执行该程序的时候就不再出现以上提示了!
另一详细解决办法:
一。在socket编程时,常遇到下面的地使用错误:
Cann't bind server socket !
: Address already in use 。
二。说明:
可以使用bindAPI 函数来绑定一个地址(一个接口和一个端口)到一个套接字端点。可以在服务器设置中使用这个函数,以便限制可能有连接到来的接口。也可以在客户端设置中使用这个函数,以便限制应当供出去的连接所使用的接口。bind最常见的用法是关联端口号和服务器,并使用通配符地址(INADDR_ANY),它允许任何接口为到来的连接所使用。
bind普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind返回EADDRINUSE),它由 TCP 套接字状态TIME_WAIT引起。该状态在套接字关闭后约保留 2 到 4 分钟。在TIME_WAIT状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。
等待TIME_WAIT结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开TIME_WAIT状态。可以给套接字应用SO_REUSEADDR套接字选项,以便端口可以马上重用。
考虑清单 3 的例子。在绑定地址之前,我以SO_REUSEADDR选项调用setsockopt。为了允许地址重用,设置整型参数(on)为 1 (不然,可以设为 0 来禁止地址重用)。
清单 3.使用 SO_REUSEADDR 套接字选项避免地址使用错误
|
在应用了SO_REUSEADDR选项之后,bindAPI 函数将允许地址的立即重用。