Я уже знаю, что невозможно просто определить, отключен ли сокет или нет — сервер и клиенты должны кричать «Ты меня слышишь?» а также «Да, я могу.«так же, как мы делаем на скайп.
Но когда boost::asio
розетка отключена с другой стороны получаю Неизвестное исключение при попытке чтения из сокета. Это своего рода обнаружение отключения достаточно полезно для меня. Могу ли я обработать это исключение, чтобы вместо сбоя программа выдала сообщение в консоли?
Немного кода для тех, кому это нужно для всего:
bool SocketClient::read(int bytes, char *text) {
char buffer = 0;
int length = 0;
while(bytes>0) {
size_t len = sock.receive(boost::asio::buffer(&buffer, 1)); //boom: UNHANDLED EXCEPTION
bytes--;
text[length] = buffer;
length++;
}
return true;
}
Поскольку я подключаюсь к серверу Minecraft, я знаю, когда клиент отключен — исключение вызывается при любой попытке чтения / записи.
try
{
size_t len = sock.receive(boost::asio::buffer(&buffer, 1)); //boom: UNHANDLED EXCEPTION
// More code ...
}
catch (const boost::system::system_error& ex)
{
if ( ex.code() == boost::asio::error::eof )
{
// Work your magic (console logging, retry , bailout etc.)
}
}
Пожалуйста, также посмотрите на доктор. В худшем случае вы можете определить тип исключения из отладчика 🙂
Других решений пока нет …