2013-03-15 4 views
-1

Я уже знаю, что невозможно просто определить, отключен ли сокет или нет - сервер и клиенты должны кричать «Вы меня слышите?» и «Да, я могу . "так же, как мы делаем на .
Но когда 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 сервер, я знаю, когда клиент отключается - исключение вызывается при любой попытке чтения/записи.

+0

Вы пытались разместить try & catch блоки? –

+0

Сделал, но я не знаю, как называется имя типа исключения, поэтому я не знаю, что помещать в 'catch()' как paramater. Мне не удалось найти это в документах, и IDE не дает мне никаких намеков. –

+0

@ TomášZato все разумные библиотеки должны получать свои исключения из 'std :: exception' - даже если я фактически не использую boost, я считаю, что достаточно разумно соблюдать это соглашение. И в любом случае руководство по эксплуатации должно иметь точный ответ. ;) В худшем случае ваш отладчик должен указать вам тип исключения. – syam

ответ

3
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.) 
    } 
} 

Также обратите внимание на doc. В худшем случае вы можете вывести тип исключения из отладчика :)

+0

К сожалению, это не сработает. '' eof ': имя параметра функции не может быть квалифицировано' - эта ошибка не имеет для меня никакого смысла, но IDE просто говорит, что 'boost :: asio :: error :: eof' не является именем типа. –

+0

О, это просто ваша неправильная интерпретация. 'boost :: system :: system_error' - это тип данных arror,' boost :: asio :: error :: eof' является константой ошибки конца потока. –

+0

Пожалуйста, подтвердите, я исправил код –

Смежные вопросы