linux bind: Address already in use(Z)
2014-04-21 15:27
239 查看
虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程。
bind
普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。
等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT
状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。
使用 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 选项之后,bind API 函数将允许地址的立即重用。
参考:http://www.ibm.com/developerworks/cn/linux/l-sockpit/
http://hi.baidu.com/zhjixi495/item/4fd113c5d4931a7ecfd4f86d
bind
普遍遭遇的问题是试图绑定一个已经在使用的端口。该陷阱是也许没有活动的套接字存在,但仍然禁止绑定端口(bind 返回 EADDRINUSE),它由 TCP 套接字状态 TIME_WAIT 引起。该状态在套接字关闭后约保留 2 到 4 分钟。在 TIME_WAIT 状态退出之后,套接字被删除,该地址才能被重新绑定而不出问题。
等待 TIME_WAIT 结束可能是令人恼火的一件事,特别是如果您正在开发一个套接字服务器,就需要停止服务器来做一些改动,然后重启。幸运的是,有方法可以避开 TIME_WAIT
状态。可以给套接字应用 SO_REUSEADDR 套接字选项,以便端口可以马上重用。
使用 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 选项之后,bind API 函数将允许地址的立即重用。
参考:http://www.ibm.com/developerworks/cn/linux/l-sockpit/
http://hi.baidu.com/zhjixi495/item/4fd113c5d4931a7ecfd4f86d
相关文章推荐
- linux bind: Address already in use
- apache错误"Address already in use"的原因和解决方法
- 杀掉某个进程!怎么查看pid,报错:Address already in use
- 启动TomCat 出现java.net.BindException:Address already in use:JVM_Bind
- Error initializing endpoint java.net.BindException: Address already in use: JVM_Bind:8080
- apache启动报错(98)Address already in use: make_sock: could not bind to address [::]:80
- 编译java时出现(端口冲突)Address already in use: JVM_Bind<null>:1919
- centOS7访问nginx失败解决-.0:80 failed (98: Address already in use)解决
- Linux下Socket编程的端口问题( Bind error: Address already in use )
- Error running Tomcat 6: Address localhost:8080 is already in use
- 服务器部署多个tomcat(Address already in use: JVM_Bind)
- unable to bind listening socket for address '127.0.0.1:9000': Address already in use
- Address already in use: JVM_Bind /Unrecognized Windows Sockets error: 0: JVM_Bind
- Address already in use: JVM_Bind(端口冲突)
- JAVA 连接mysql 时Address already in use: connect
- cdh5.8.3安装完毕后,启动zookeeper一段时间后报错:节点选举受限制!Address already in use
- Linux 下 Address already in use 错误的解决
- address already in use: jvm_bind
- 解决 项目报错java.net.bindexception: address already in use: jvm_bind:8080