扁平化设计风格的网站模板免费下载,建设公司网站需要多少天,衡水企业做网站,网站月流量5g先启动Server#xff0c;再启动Client#xff0c;然后使用CtrlC关闭Server#xff0c;马上再运行Server#xff0c;会得到以下结果#xff1a; bind error: Address already in use这是因为#xff0c;虽然Server的应用程序终止了#xff0c;但TCP协议层的连接并没有完全… 先启动Server再启动Client然后使用CtrlC关闭Server马上再运行Server会得到以下结果 bind error: Address already in use这是因为虽然Server的应用程序终止了但TCP协议层的连接并没有完全断开因此Server不能再监听同样的端口 使用netstat命令可以查看Server终止时Socket描述符会自动关闭并发FIN段给ClientClient收到FIN后处于CLOSE_WAIT状态但是Client并有终止也没有关闭Socket描述符因此不会发FIN给Server最终导致Server的TCP连接处于FIN_WAIT2状态 我们再使用CtrlC将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描述符