Реализация функции отключения - PullRequest
0 голосов
/ 17 января 2019

Итак, допустим, у меня есть клиент, и для ответа на сообщения сервера клиент должен иметь функцию, которая их прослушивает, как в моем коде:

int Client::loop(void *data)
{
Client *instance = (Client*)data;
for (;;)
{
    boost::array<unsigned char, PACKET_LENGTH> buf;
    boost::system::error_code error;
    // Read any incoming package
    size_t len = instance->socket.read_some(boost::asio::buffer(buf), error);

    if (error == boost::asio::error::eof)
    {
        // Connection closed, return
        return 0;
    }

    DataHeader header = static_cast<DataHeader>(buf[0]);

    switch (header) // Let's see which type of packet the server is sending.
    {
        case GTREG: // Server is sending a GTREG response.
            instance->getRegionResponse(buf);
            break;
        case PLOBJ: // Server is sending a PLOBJ response.
            instance->placeObjResponse(buf);
            break;
        case MOVPL: // WIP.
            break;
        case SYOBJ: // Server is sending an object that other player placed.
            instance->syncObj(buf);
            break;
        default:
            break;
    }
}
}

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

Эта "функция закрытия" вызывается основным процессом моей программы, поэтому ей необходимо как-то сообщить клиентскому потоку о завершении работы перед закрытием.

Теперь, как мне это сделать? Я пробовал такую ​​функцию:

void Client::disconnect()
{
    boost::system::error_code error;
    socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, error);
    socket.close();
}

Однако при его использовании происходит сбой приложения с ошибкой.

Есть ли что-то, что я пропускаю? Заранее спасибо за любую помощь!

1 Ответ

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

Вы должны закрыть сокет, затем дождаться завершения потока, прежде чем закрывать сокет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...