【发布时间】:2011-11-30 18:13:39
【问题描述】:
我的任务是实现在通过 TCP 连接的两台计算机之间进行的两人游戏。其中一项要求是只有获胜者才能选择是否再次游戏。如果服务器获胜并决定不再继续游戏,客户端应作为服务器重新启动并接受新连接。
我的方法: 如果游戏丢失(在客户端模式下),关闭 sockfd 并重新创建另一个。然后使用 setsockopt 允许使用 SO_REUSEADDR 重新绑定,然后调用 bind。
int yes = 1;
if ( setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1 )
{
perror("setsockopt");
}
if ( bind(sockfd, (struct sockaddr*)&svr, sizeof(svr) ) == -1 )
{
perror("server: bind");
}
但是,我仍然收到相同的“地址已在使用”错误。在重新创建套接字之前,我尝试睡了 150 秒,并且此方法有效。
注意:我正在同一台 PC 上进行测试。它可以在两台链接的 PC 上运行,但必须让它在同一台 PC 上运行。请帮忙。
【问题讨论】:
-
请出示您的代码(尤其是
setsockopt()周围的部分)以便我们提供帮助。 -
您确定在客户端代码中尝试重新创建服务器端(侦听套接字)之前已正确关闭它吗?在 Linux 系统上,“netstat -tlp”应该确定是什么让 TCP 端口处于打开状态以监听它...
-
您尝试在一台机器上绑定()相同的 {address,portnum} 两次?您希望会发生什么?
-
好吧,等待 120 秒后,该方法有效。所以我想它可以通过使用 SO_REUSEADDR 立即工作。但是,如果我错了,请告诉我。
-
@BRPocock:你是对的。在套接字关闭之前有一个 sleep(1),这就是我无法绑定的原因。现在,它完美运行。感谢您的提示! :)