Linux Server 终止后立即重启报错 bind error: Address already in use

编程入门 行业动态 更新时间:2024-10-12 03:18:13

Linux Server 终止后立即重启<a href=https://www.elefans.com/category/jswz/34/1771188.html style=报错 bind error: Address already in use"/>

Linux Server 终止后立即重启报错 bind error: Address already in use

  • 先启动Server,再启动Client,然后使用Ctrl+C关闭Server,马上再运行Server,会得到以下结果:

    bind error: Address already in use
    
  • 这是因为,虽然Server的应用程序终止了,但TCP协议层的连接并没有完全断开,因此Server不能再监听同样的端口

  • 使用netstat命令可以查看,Server终止时,Socket描述符会自动关闭并发FIN段给Client,Client收到FIN后处于CLOSE_WAIT状态,但是Client并有终止,也没有关闭Socket描述符,因此不会发FIN给Server,最终导致Server的TCP连接处于FIN_WAIT2状态

  • 我们再使用Ctrl+C将Client终止掉,Client终止时自动关闭Socket描述符,Server的TCP连接收到Client发的FIN段后处于TIME_WAIT状态;TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间后才能回到CLOSED状态,MSL在RFC1122中规定为两分钟,但各操作系统的实现不同,Linux上一般为半分钟

  • 由于我们先终止了Server,所以Server是主动关闭连接的一方,在TIME_WAIT期间仍然不能再次监听同样的Server端口

  • 在Server的TCP连接没有完全断开之前不允许重新监听是不合理的,因为前后Server占用的是同一个端口,但不一定是同一个IP地址

  • 可以通过setsockopt()设置Socket描述符的选项SO_REUSEADDR为1,表示允许创建端口号相同但IP地址不同的多个Socket描述符

更多推荐

Linux Server 终止后立即重启报错 bind error: Address already in use

本文发布于:2023-12-05 03:30:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1662930.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:报错   重启   Server   Linux   error

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!