用SFML处理多个客户插座
Handling multiple client sockets with SFML
我当前正在尝试编写小型多人游戏的网络部分,而我正面临一个问题来存储我的TCP插座,而TCP插座是在SFML中,不可仿制(我是一个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;
};
我打算最初打算在客户连接时做的是:
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::map
或std::vector
中会导致相同的问题,因为它们都复制对象。将它们作为指针(在地图中(将其存储到原始的TCPSOCKECT将其引起与以前相同的问题,因为插座也会更改,并且指针将指向相同的对象。
我如何在不使用参考,指针或复制我的对象的情况下存储插座?
任何帮助将不胜感激:(
,没有指针将是真正的痛苦。我个人使用智能指针来管理插座本身(std::vector<std::unique_ptr<sf::TcpSocket>>
或Similiar(,以及" sf :: socketselector"来管理实际的通信
相关文章:
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 从服务器传输到客户端的消息不会出现
- OpenSSL TLS服务器-使用客户端证书白名单
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何绑定 C++ gRPC 客户端的网络接口
- C++套接字客户端到 Python 服务器未创建连接
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 将相机数据从服务器实时流式传输到客户端
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- UDP客户端/服务器程序在不同的IP和端口上通信超过2个插座
- 插座无法接收数据?客户使用boost.asyio库编写.服务器用Python编写
- 用SFML处理多个客户插座
- 使用WinSocket客户端/服务器应用程序重复使用插座