bind()与SO_REUSEADDR失败

tec*_*eak 6 c sockets bind

我的任务是实现在通过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");
}
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到相同的"地址已被使用"错误.在尝试重新创建套接字之前,我已经尝试过休眠150秒,这种方法很有效.

注意:我在同一台PC上测试它.它可能适用于两台连接的PC,但必须使其在同一台PC上运行.请帮忙.

caf*_*caf 2

由于您在同一系统上运行此程序,因此听起来好像存在竞争条件。bind()客户端在服务器关闭套接字之前尝试连接该套接字(假设服务器和客户端都SO_REUSEADDR在其套接字上进行设置)。

您需要实现某种握手,允许服务器在关闭侦听套接字后通知客户端 - 也许服务器应该在关闭上一个游戏的活动套接字之前关闭侦听套接字?