我的任务是实现在通过TCP连接的两台计算机之间播放的双人游戏。其中一个要求是只有获胜者可以选择再次参加比赛。如果服务器获胜并决定不进一步播放,客户端应该重新启动服务器并接受新的连接。与SO_REUSEADDR绑定()失败
我的方法: 如果游戏LOST(客户端模式),关闭的sockfd并重新创建一个又一个。然后使用setsockopt来允许使用SO_REUSEADDR重新绑定,然后调用绑定。
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侦听端口... – BRFennPocock
您试图在同一台机器上绑定()同一个{address,portnum}两次?你期望会发生什么? – wildplasser