Bugs

MMORPG game develop.

网络编程 心得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则不行。

posted on 2008-04-08 14:43 Bugs 阅读(2810) 评论(2)  编辑 收藏 引用

评论

# re: 网络编程 心得1 2008-04-09 12:40 追梦时代

谢谢楼主,你说的问题我也遇到过  回复  更多评论   

# re: 网络编程 心得1 2008-04-11 13:45 Bugs

根据ACE网络编程下提到:
在winsock2已经不存在这个问题了,不知道winsock1是否有,没有机会做测试了,有机会的朋友,找个NT4环境测试下吧。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理