如何制作具有同步数据读/写功能的多客户端服务器
How to make a multi-client server with synchronous dataread/write functions?
好吧,所以我可能在这里遇到了一个大问题。一直以来,我的代码都基于我可能不想要的东西,也就是说,我正在使用同步boost::asio函数和一个可以同时拥有多个客户端的服务器。这是:
void session(tcp::socket socket, std::vector<Player>* pl)
{
debug("New connection! Reading username...n");
/* ...Username verification code removed... */
debug("Client logged in safely as ");
debug(u->name);
debug("n");
for (;;)
{
boost::array<unsigned char, 128> buf;
size_t len = socket.read_some(boost::asio::buffer(buf), error);
if (error == boost::asio::error::eof)
{
debug("Connection ended.n");
break; // Connection closed cleanly by peer.
}
else if (error)
throw boost::system::system_error(error); // Some other error.
DataHeader ins = static_cast<DataHeader>(buf.data()[0]);
std::vector<unsigned char> response;
/* ... Get appropiate response... */
// send response
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(response), ignored_error);
//debug("Sent ");
//debug(response.size());
//debug("B to client.n");
}
}
正如您从代码中看到的,我在一个非理想的场景中使用read_some
和write
函数。现在,问题是,我是如何使这些代码同时可用于多个客户端的?我用了线程:
int main()
{
try
{
boost::asio::io_context io_context;
tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));
debug("Ready.n");
for (;;)
{
std::thread(session, acceptor.accept(), &players).detach(); // Accept incoming clients
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
现在,我从未遇到过这种设置的问题,直到最近,我开始在一台服务器上同时测试多个客户端。这导致服务器多次崩溃,直到现在,我还认为问题只是连接问题。然而,现在我开始怀疑,"问题可能是同步功能吗?">
到目前为止,我看到的所有多客户端服务器的例子都使用异步函数,可能是因为需要它们。所以,我的最后一个问题是,我真的需要异步函数吗?这个代码有什么问题导致它崩溃吗?最后,如果需要异步函数,我该如何实现它们?非常感谢!
正如用户VTT所指出的,尽管这种方法可能会运行一段时间,但由于资源耗尽,最好切换到异步函数,因此,我将重做整个服务器来实现它们。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 如何在C++中获得"静态纯虚拟"功能?
- 封装ESP8266 Web服务器的粘合剂功能
- 如何制作具有同步数据读/写功能的多客户端服务器
- 带有简单功能的boost :: ASIO服务器
- 在同一功能/程序中使用WebSocket++服务器和客户端
- C++原型软件ZMQ.客户端-服务器接口的功能
- 具有进程间通信功能的服务器-客户端日志记录体系结构.你知道解决方案吗?
- c ++:TCP服务器"bind"功能失败(errno 98),如果我在两次连续应用程序启动之间没有等待足够的时间
- libssh是否支持sftp服务器功能
- 如何从客户端关闭gRPC服务器(使用RPC功能)
- QT服务器端写入功能出错(在线程0..中停止)
- 正在确定节俭上的服务器功能