Хорошо, поэтому я мог бы получить себе большую проблему здесь. Все это время я основывал свой код на том, чего я, возможно, хотел бы , а не , то есть я использую синхронные функции 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;
}
Теперь у меня никогда не было проблем с этой настройкой до недавнего времени, когда я начал тестировать несколько клиентов одновременно на одном сервере. Это приводило к сбою сервера много раз, и до сих пор я думал, что проблема заключается только в проблемах соединения. Однако теперь я начал задаваться вопросом: «Может ли быть проблема в синхронных функциях?»
Все примеры, которые я видел до сих пор, о мультиклиентных серверах используют асинхронные функции, и, возможно, это потому, что они необходимы . Итак, мой последний вопрос: действительно ли мне нужны асинхронные функции? Что-то не так с этим кодом, чтобы он вылетал? И, наконец, если нужны асинхронные функции, как я могу их реализовать? Большое спасибо заранее!