在Linux下编写网络程序,当网络服务进程关掉的时候,再立即启动该服务,会有错误提示说port被占用了,监听失败。
《unix 网络编程》第二章 2.7介绍了TIME_WAIT状态,这个状态时间是TCP里最长的,是二倍MSL时间,大约在1-4分钟。
这样的问题是可以解决的,使用SO_REUSEADDR enables local address reuse,可以在TIME_WAIT状态下使用相同的PORT。
int reuser_addr = 1;
::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&reuse_addr, sizeof(reuse_addr));
::setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const void*)&reuse_addr, sizeof(reuse_addr));
SO_REUSEADDR 的用途除了上面这种情况,还有三种分别是:
*)在多网卡的时候,多进程可以使用不同IP,相同PORT。
*)与上条差不多,在单进程使用使用不同IP,相同PORT。
*)在UDP广播的时候,可以在相同IP和PORT下使用,TCP则不行。
*)在多网卡的时候,多进程可以使用不同IP,相同PORT。
*)与上条差不多,在单进程使用使用不同IP,相同PORT。
*)在UDP广播的时候,可以在相同IP和PORT下使用,TCP则不行。
1 条评论:
夏天来了~~~
发表评论