作者:Bugs 来源:C++博客 酷勤网收集 2008-04-10
摘要
看《unix 网络编程》,在里面了解到了 链接时的三次握手和关闭时的四次握手,在关闭时最后会有一个TIME_WAIT状态,这个状态时间是TCP里最长的,是二倍MSL时间,大约在1-4分钟。但这样的问题是可以解决的,使用SO_REUSEADDR,可在TIME_WAIT状态下使用相同的PORT。
以前项目里发现一个这样的问题,当网络服务进程关掉的时候,在立即启动该服务,会有错误提示说port被占用了,监听失败。
最近在看《unix 网络编程》,在里面了解到了 链接时的三次握手 和 关闭时的四次握手,
在关闭时最后会有一个TIME_WAIT状态,这个状态时间是TCP里最长的,是二倍MSL时间,大约在1-4分钟。
至于为什么要保留这个状态和这么长的时间,请参考《unix 网络编程》第二章 2.7.
但这样的问题是可以解决的,使用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));
SO_REUSEADDR 的用途除了上面这种情况,还有三种分别是:
*)在多网卡的时候,多进程可以使用不同IP,相同PORT。
*)与上条差不多,在单进程使用使用不同IP,相同PORT。
*)在UDP广播的时候,可以在相同IP和PORT下使用,TCP则不行。
来自:http://www.cppblog.com/Bugs/archive/2008/04/08/46509.html

