C++ 使用SFML处理多个客户端套接字

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<

我目前正在尝试编写一个小型多人游戏的网络部分,我面临着一个存储TCP套接字的问题,在SFML中,TCP套接字是不可复制的(我是C++的初学者)

我有三个类:
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专业知识的怪人,加入我们吧……我会尝试一下:)