关于SO_REUSEADDR 和SO_KEEPALIVE

33 views
Skip to first unread message

清风雨

unread,
Nov 25, 2006, 7:41:12 AM11/25/06
to 高性能网络编程邮件列表
第一个问题:
以前错误的以为SO_REUSEADDR会导致已bind的端口会被再次bind,实际上不会,只有当该端口处于TIME_WAIT状态才可以重用。
那么也就是说reuse不会带来什么不利(或者,还希望你能告诉我),为什么缺省的不是reuse呢?

第二个问题:
据MSDN介绍,SO_KEEPALIVE是不一定支持的。也就是说TCP/IP,在另一端异常断开时,缺省是无能为力的(以前一直以为TCP的超时机制会探测的,而且还是很精心的方式),或者是我没有搞懂(劳烦指点)。那么TCP/IP协议本身是不负责连接断开检测的,是不是这有点不可思议?

疯子阿虹

unread,
Nov 26, 2006, 9:10:35 PM11/26/06
to 高性能网络编程邮件列表
SO_REUSEADDR,没怎么用过。记得。如果你reuse的话,另外一个程序也监听这个端口,
那么就有可能出现错误啊。

SO_KEEPALIVE我记得是2k以后才支持的。记得。印象,具体没考证!!

劉威志

unread,
Nov 26, 2006, 9:27:44 PM11/26/06
to dev4s...@googlegroups.com
SO_REUSEADDR 在windows上可以bind同一位置,会造成某个socket accept 不到
connection,我们这里曾发生这样的问题,program crash之後实际上还在memory之
内,bind 还存在,结果後面bind的收不到某些connection

SO_KEEPALIVE default 是 2 小时,要设定system parameter才能修改

疯子阿虹

unread,
Nov 26, 2006, 11:02:56 PM11/26/06
to 高性能网络编程邮件列表
你说了一下"SO_KEEPALIVE default 是 2 小时"

我才突然想起来,好像在2K之前,SO_KEEPALIVE只能设置一个全局的alive时间。
2K之后才修改到可以给每一个connection设置私有的alive时间!

清风雨

unread,
Nov 27, 2006, 12:32:56 AM11/27/06
to 高性能网络编程邮件列表
检测bind成功了没?
我试过一个程序开着,另一个也bind不能成功。--
也就是说不会重复bind或踢出。
crash后,应该可以bind成功的。比如杀死了,再开程序,如果设了REUSE就可以了;如果没设置一般要等待一段时间,才能重新bind到该端口。

清风雨

unread,
Nov 27, 2006, 12:34:55 AM11/27/06
to 高性能网络编程邮件列表
是的。
但是,MSDN一说不一定支持,这不是让人很奇怪吗?因为它等于说TCP/IP缺省是不负责坏死连接的检测的。

trus...@gmail.com

unread,
Nov 29, 2006, 3:06:46 AM11/29/06
to 高性能网络编程邮件列表
据我试验下来 如果设置了SO_REUSEADDR
,就可以在原本已有的连接上bind成功,也就是说可以冲掉前面的那个连接,例如a程序开在192.168.0.5:2500上,那个时候b程序(设置了SO_REUSEADDR
)就可以在192.168.0.5:2500上开启成功,那个时候用c程序来连接192.168.0.5:2500,是和b程序连接成功了

清风雨

unread,
Nov 29, 2006, 11:56:20 PM11/29/06
to 高性能网络编程邮件列表
你肯定不小心搞错了,我们试过的,没有问题,如果a程序正常开着。
Reply all
Reply to author
Forward
0 new messages