Итак, допустим, у меня есть клиент, и для ответа на сообщения сервера клиент должен иметь функцию, которая их прослушивает, как в моем коде:
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();
}
Однако при его использовании происходит сбой приложения с ошибкой.
Есть ли что-то, что я пропускаю? Заранее спасибо за любую помощь!