端口复用
在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));
文章讨论了在服务器TCP连接未完全断开时重新监听同一端口的合理性,解释了connfd和listenfd的区别,并提出通过设置SO_REUSEADDR选项来允许端口复用,以解决IP地址不同的多个socket描述符在同一端口的创建问题。需要注意,设置该选项后,先前的网络程序将无法使用该端口。

被折叠的 条评论
为什么被折叠?



