gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:14:30 25 4
gpt4 key购买 nike

我目前正在尝试编写一个小型多人游戏的网络部分,但我在存储我的 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()));
}
}

因此,在 ClientManager 的列表中添加一个新的 Client,及其 ID、一个用于发送信息的 TcpSocket 及其地址。

但是,问题是 SFML 的 TcpSocket 类不可复制,这意味着我不能像这样将它复制到客户端。

我可以将它作为指向原始 TcpSocket 的指针传递,但是如果另一个客户端连接怎么办?指针指向的数据将发生变化,程序将出现错误。我不知道这种行为是否与智能指针相同,但我认为是(但我根本不掌握它们)。

将它们存储在 std::mapstd::vector 中会导致相同的问题,因为它们都复制对象。将它们存储为指向原始 TcpSocket 的指针(在映射中)将导致与以前相同的问题,因为套接字也会发生变化,并且指针将指向同一个对象。

如何在不使用引用、指针或复制对象的情况下存储套接字?

任何帮助将不胜感激:)

最佳答案

如果没有指针,那将是一件非常痛苦的事情。我个人使用智能指针来管理套接字本身(std::vector<std::unique_ptr<sf::TcpSocket>> 或类似的),以及 `sf::SocketSelector' 来管理实际的通信

关于c++ - 使用 SFML 处理多个客户端套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com