我正在为游戏制作多线程tcp服务器.
我遇到套接字问题,当服务器停止从客户端收到信息时,我关闭了我接受()(如下所示)的套接字并退出线程并通知主线程该槽不再忙.
clientData.client[next] ) = accept(server,(struct sockaddr *)&client_address,&t));
Run Code Online (Sandbox Code Playgroud)
(错误检查在这里省略但我确实有)
然而,当我再次尝试进入该插槽时,它给了我一个糟糕的文件描述符,我做了一些挖掘,发现close()完全破坏了一个套接字并使其无法用于其余的运行(如果我是的话请纠正我错误).
现在让我感到困惑的是:
a)我仍然可以使用套接字接受,并且我找回文件描述符,问题是当我尝试在套接字上使用recv()时这样.
n = (recv(c->client[threadLocal], str, 100, 0);
Run Code Online (Sandbox Code Playgroud)
(错误检查在这里省略但我确实有)
b)当我到达我的套接字数组中的最后一个插槽时,我可以重复使用套接字,这很奇怪,如果第一次运行时遇到问题但不是最后一次我得到了我错过的感觉.
c)如何使套接字可重用?或者什么是制作可以在程序运行的其余部分重用的套接字的好方法.
所有帮助都非常有用,因为老实说,我对这里发生的事情非常困惑.
编辑:好的,这是我试图做的一个小例子.我在一个结构中有一个套接字数组,代表服务器上的插槽.我意识到可能更容易做一个代表包含套接字的玩家的结构列表,所以当有人加入时你可以创建一个新的结构,但我现在不想,因为这需要大量的工作,但是如果没有选择,我会这样做.
struct clientData{
int clientSocket[maxplayers];
//and some other stuff
};
Run Code Online (Sandbox Code Playgroud)
当玩家加入时,他们会获取列表中的第一个可用套接字并接受(),当客户端断开连接时,我希望套接字可供另一个客户端声明.基本上我希望旧客户端放弃close()或类似的东西以及稍后连接的新客户端,以便能够在阵列中重用此套接字/位置.
我正在寻找一种重置套接字的方法,以便在需要时再次使用它.我希望这让事情变得更容易理解,再次感谢.