用SFML处理多个客户插座

Handling multiple client sockets with SFML

本文关键字:客户 插座 SFML 处理      更新时间:2023-10-16

我当前正在尝试编写小型多人游戏的网络部分,而我正面临一个问题来存储我的TCP插座,而TCP插座是在SFML中,不可仿制(我是一个c 的初学者(。

我有三个类:ServerClient(用于存储有关连接客户端的所有信息的服务器端类(和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;
};

我打算最初打算在客户连接时做的是:

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()));
   }
}

因此,将新的Client添加到ClientManager的列表中,其ID,一个tcpsocket发送信息和他的地址。

但是,问题在于SFML的TCPSOCTECT类是不可复制的,这意味着我不能将其复制到这样的客户端。

我可以将其作为指针将其传递给原始的TCPSOCTED,但是如果另一个客户连接,该怎么办?指针指向的数据将具有更改,并且程序将发生错误。我不知道这种行为是否与智能指针相同,但我认为(但我根本不掌握它们(。

将它们存储在std::mapstd::vector中会导致相同的问题,因为它们都复制对象。将它们作为指针(在地图中(将其存储到原始的TCPSOCKECT将其引起与以前相同的问题,因为插座也会更改,并且指针将指向相同的对象。

我如何在不使用参考,指针或复制我的对象的情况下存储插座?

任何帮助将不胜感激:(

,没有指针将是真正的痛苦。我个人使用智能指针来管理插座本身(std::vector<std::unique_ptr<sf::TcpSocket>>或Similiar(,以及" sf :: socketselector"来管理实际的通信