2008年4月9日星期三

Unix编程的port占用问题

在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));

SO_REUSEADDR 的用途除了上面这种情况,还有三种分别是:
*)在多网卡的时候,多进程可以使用不同IP,相同PORT。
*)与上条差不多,在单进程使用使用不同IP,相同PORT。
*)在UDP广播的时候,可以在相同IP和PORT下使用,TCP则不行。

1 条评论: