C++ 使用SFML处理多个客户端套接字
我目前正在尝试编写一个小型多人游戏的网络部分,我面临着一个存储TCP套接字的问题,在SFML中,TCP套接字是不可复制的(我是C++的初学者) 我有三个类:C++ 使用SFML处理多个客户端套接字,c++,pointers,sfml,stdmap,C++,Pointers,Sfml,Stdmap,我目前正在尝试编写一个小型多人游戏的网络部分,我面临着一个存储TCP套接字的问题,在SFML中,TCP套接字是不可复制的(我是C++的初学者) 我有三个类:Server、Client(一个用于存储有关连接客户端的所有信息的服务器端类)和ClientManager,它负责存储所有客户端并给它们ID,等等 ClientManager.h class ClientManager { public: ClientManager(); std::map<
Server
、Client
(一个用于存储有关连接客户端的所有信息的服务器端类)和ClientManager
,它负责存储所有客户端并给它们ID,等等
ClientManager.h
class ClientManager {
public:
ClientManager();
std::map<int, Net::Client*> getClients();
int attribID();
void addClient(Net::Client *client);
sf::TcpSocket getClientSocket(int id) throw(std::string);
void setClientSocket(int id, sf::TcpSocket);
private:
std::map<int, Net::Client*> m_clients;
std::map<int, sf::TcpSocket> m_clientSockets;
std::vector<int> m_ids;
int m_lastID;
};
类客户端管理器{
公众:
客户经理();
std::map getClients();
int attr同上();
void addClient(Net::Client*Client);
sf::tcpsocketgetclientsocket(int-id)抛出(std::string);
void setClientSocket(int-id,sf::TcpSocket);
私人:
标准::映射m_客户端;
标准::映射m_客户端套接字;
std::向量m_id;
int m_lastID;
};
当客户端连接时,我最初计划做的是:
void Net::Server::waitForClient() {
while(true) {
if(m_listener.accept(m_tcpSocket) != Socket::Done) {
cout << "Error happened during client connection. skipping. " << endl;
return;
}
int newID = m_clientManager.attribID();
this->m_clientManager.addClient(new Net::Client(newID, m_tcpSocket, m_tcpSocket.getRemoteAddress()));
}
}
void Net::Server::waitForClient(){
while(true){
if(m_listener.accept(m_tcpSocket)!=Socket::Done){
如果没有指针,那将是一件非常痛苦的事情。就我个人而言,我使用智能指针来管理套接字本身(std::vector
或类似),以及“sf::SocketSelector”来管理实际通信我回家后必须对此进行更多研究,但我相信您可以将套接字的地址传递给您的clientManager,然后从套接字获取IP和端口信息并存储这些信息。您可以使用动态内存,使用std::unique_ptr或shared_ptr将指针存储在vector/map中(这需要为每个连接分配内存)。嘿,谢谢你的回答!这确实需要为每个新连接的客户端分配内存(或者我们只会遇到指针的情况)。通过分配内存,您的意思是:在while循环的开头创建一个shared\u ptr
指针,使用new
分配内存,然后使用std::map
(或使用另一个shared\u ptr
的任何其他方式)将它们存储在ClientManager
中?是的,这就是我的意思。如果有人有同样的问题(即存储SFML套接字),我在他们的文档中找到了一个很好的例子:正如我在回答Eddge的评论中所建议的,这就是我最后要做的事情,除了我使用了std::map
(因为我也需要一个ID)和std::shared_ptr
(我不知道它是否适合我的用例,因为我不太精通智能指针,但至少可以工作)。我也使用了sf::SocketSelector
),我建议在可能的情况下使用unique_ptr而不是shared_ptr(关于这一点,互联网上有很多争论,我不会让你感到厌烦……),但我怀疑它会给你带来任何问题。很高兴它能起作用:)我稍后会(详细)看一看,这是我想了解更多的主题的一部分:)如果你经常使用SFML,irc频道充满了(大部分是有用的)有(有些没有)SFML专业知识的怪人,加入我们吧……我会尝试一下:)