Как сделать мультиклиентный сервер с синхронными функциями записи / записи данных? - PullRequest
0 голосов
/ 19 января 2019

Хорошо, поэтому я мог бы получить себе большую проблему здесь. Все это время я основывал свой код на том, чего я, возможно, хотел бы , а не , то есть я использую синхронные функции 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;
}

Теперь у меня никогда не было проблем с этой настройкой до недавнего времени, когда я начал тестировать несколько клиентов одновременно на одном сервере. Это приводило к сбою сервера много раз, и до сих пор я думал, что проблема заключается только в проблемах соединения. Однако теперь я начал задаваться вопросом: «Может ли быть проблема в синхронных функциях?»

Все примеры, которые я видел до сих пор, о мультиклиентных серверах используют асинхронные функции, и, возможно, это потому, что они необходимы . Итак, мой последний вопрос: действительно ли мне нужны асинхронные функции? Что-то не так с этим кодом, чтобы он вылетал? И, наконец, если нужны асинхронные функции, как я могу их реализовать? Большое спасибо заранее!

1 Ответ

0 голосов
/ 20 января 2019

Как указал пользователь VTT , хотя этот подход может работать немного, просто лучше переключиться на асинхронные функции из-за нехватки ресурсов, поэтому я буду просто переделайте весь сервер для их реализации.

...