Как обработать ошибку сокета во время процедуры выхода из системы
Я пишу библиотеку мгновенных сообщений. В настоящее время, когда возникает SocketException во время чтения или записи в сокет, я запускаю процедуру выхода изнутри приложения, передавая SocketException конечному пользователю в качестве аргумента LogoutEventArgs. Это дает конечному пользователю возможность увидеть, какое именно исключение вызвало незапрошенный выход из системы.
Мой вопрос: что мне делать, если во время вызова пользователем функции Logout сокет фактически выдает исключение.
Пример - конечный пользователь вызывает функцию выхода из системы, и пока функция выхода из системы ожидает корректного завершения существующих запросов, сокет создает исключение в потоке чтения.
У меня есть два варианта, как я вижу это -
Притворитесь, что ошибка не произошла, и просто действуйте как разъединенный сокет как часть нашего Выхода из системы.
Когда возникает исключение сокета, посмотрите, выполняется ли запрос на выход из системы, и если да, переопределите его. В результате исходный запрос выхода из системы выдает исключение AlreadyLoggedOutException, а также отдельное событие выхода из системы, которое передает исключение в LogoutEventArgs.
Кроме того, немного связано - Что мне делать, если сервер инициирует отключение, которое не было запрошено (то есть.. вызов read возвращает ноль).. Сервер.NET Messenger имеет тенденцию делать это, если вы отправляете запрос не нравится Я рассматриваю это как исключение само по себе?
Я обнаружил, что вся разъединяющая / выходящая из моей части библиотека была главным занудством на моей стороне. Я просто не могу обернуть голову вокруг этого. Кто-нибудь знает какие-либо приложения с открытым исходным кодом, которые прекрасно справляются с этой ситуацией?
Я так долго пытался взяться за эту вещь в моей голове, это сводит меня с ума.
1 ответ
Я решил не передавать SocketException конечному пользователю, поскольку разъединение не является действительно исключением, и его следует ожидать и иметь дело с ним. Вместо этого в LogoutEventArgs есть свойство LogoutReason, которое указывает причину выхода из системы.
Я решил, что если отключение происходит во время выхода из системы, то это на самом деле не исключение, так как выход из системы все равно будет отключаться. Я просто игнорирую исключение в этом случае.