41. Address already in use

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 套接字选项避免地址使用错误
int sock, ret, on; struct sockaddr_in servaddr; /* Create a new stream (TCP) socket */ sock = socket( AF_INET, SOCK_STREAM, 0 ): /* Enable address reuse */ on = 1; ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) ); /* Allow connections to port 8080 from any available interface */ memset( &servaddr, 0, sizeof(servaddr) ); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl( INADDR_ANY ); servaddr.sin_port = htons( 45000 ); /* Bind to the address (interface/port) */ ret = bind( sock, (struct sockaddr *)&servaddr, sizeof(servaddr) );

在应用了SO_REUSEADDR选项之后,bindAPI 函数将允许地址的立即重用。

 
资料来源:

转载于:https://my.oschina.net/quanpower/blog/150652

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值