嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-11-13 2573 次浏览 标签 : socket

    下面的笔记是记录我在练习select服务器的开发中用到的作用,其他更复杂的功能暂时还没用到,就先不记了,其他更多说明可以参考这篇文章 http://www.cnblogs.com/mydomain/archive/2011/08/23/2150567.html

    一般来说,一个端口释放后会等待两分钟之后才能再被使用,这段时间是消耗在了socketTIME_WAITCLOSED,正常情况下只有当socket的状态值为CLOSED的时候才能被重新利用。之前我也好奇为什么有时候我一个程序 kill 了,当然重启时提示我端口被占用,而过了一会就好了,其实就是这个原因。

[root@localhost unix]# rm a.out 
rm: remove regular file `a.out`? yes
[root@localhost unix]# gcc tcp02.c 
[root@localhost unix]# ./a.out 
bind error: Address already in use
[root@localhost unix]# ./a.out 
bind error: Address already in use
[root@localhost unix]# netstat -anp|grep 8031
tcp        0      0 10.211.55.4:8031            10.211.55.2:49830           TIME_WAIT   -

    而SO_REUSEADDR的作用就是,让端口释放后就可以立即被再次使用。SO_REUSEADDR对处于TIME_WAIT状态下的socket TCP套接字可以立即重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。

    当有socket a处于 TIME_WAIT 状态时,而你启动的程序的 socket b 要占用该地址和端口,你的程序就要用到该选项。

    TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,也就是调用close()之后,就等2MSL后即可回到CLOSED可用状态了。具体查看 tcp/ip 协议。

MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现都必须选择一个确定的MSL值.RFC 1122建议是2分钟,但BSD传统实现采用了30秒.TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。


嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表