socket 端口复用

  • Post author:
  • Post category:其他


TCP协议规定,主动关闭连接的一方处于TIME_WAIT状态,等待两个MSL的时间后才能回到CLOSED状态,如果先CTRL-C终止了server,所以server是主动关闭连接的一方,在TIME_WAIT期间仍然不能再次监听同样的server 端口;

端口复用

在server的TCP连接没有完全断开之前不允许重新监听是不合理的。因为TCP连接没有完全断开指的是connfd(127.0.0.1:6666)没有完全断开,而我们重新监听的是lis-tenfd(0.0.0.0:6666),虽然是占用同一个端口,但是Ip地址不同,connfd对应的是与某个客户端通讯的一个具体IP地址,而listenfd对应的是wildcard address.解决这个问题是使用setsockopt设置socket描述符的选项是SO_REUSEADDR为1,表示允许创建端口号相同但IP地址不同的多个socket描述符;

在server代码的socket()和bind()调用之间插入如下代码:

int opt =1;

setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));



版权声明:本文为weixin_37603532原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。