网络编程 心得1

网络编程 心得1



以前项目里发现一个这样的问题,当网络服务进程关掉的时候,在立即启动该服务,会有错误提示说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则不行。

你可能感兴趣的:(网络编程 心得1)