Как обработать ошибку сокета во время процедуры выхода из системы

Я пишу библиотеку мгновенных сообщений. В настоящее время, когда возникает SocketException во время чтения или записи в сокет, я запускаю процедуру выхода изнутри приложения, передавая SocketException конечному пользователю в качестве аргумента LogoutEventArgs. Это дает конечному пользователю возможность увидеть, какое именно исключение вызвало незапрошенный выход из системы.

Мой вопрос: что мне делать, если во время вызова пользователем функции Logout сокет фактически выдает исключение.

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

У меня есть два варианта, как я вижу это -

  1. Притворитесь, что ошибка не произошла, и просто действуйте как разъединенный сокет как часть нашего Выхода из системы.

  2. Когда возникает исключение сокета, посмотрите, выполняется ли запрос на выход из системы, и если да, переопределите его. В результате исходный запрос выхода из системы выдает исключение AlreadyLoggedOutException, а также отдельное событие выхода из системы, которое передает исключение в LogoutEventArgs.

Кроме того, немного связано - Что мне делать, если сервер инициирует отключение, которое не было запрошено (то есть.. вызов read возвращает ноль).. Сервер.NET Messenger имеет тенденцию делать это, если вы отправляете запрос не нравится Я рассматриваю это как исключение само по себе?

Я обнаружил, что вся разъединяющая / выходящая из моей части библиотека была главным занудством на моей стороне. Я просто не могу обернуть голову вокруг этого. Кто-нибудь знает какие-либо приложения с открытым исходным кодом, которые прекрасно справляются с этой ситуацией?

Я так долго пытался взяться за эту вещь в моей голове, это сводит меня с ума.

1 ответ

Решение

Я решил не передавать SocketException конечному пользователю, поскольку разъединение не является действительно исключением, и его следует ожидать и иметь дело с ним. Вместо этого в LogoutEventArgs есть свойство LogoutReason, которое указывает причину выхода из системы.

Я решил, что если отключение происходит во время выхода из системы, то это на самом деле не исключение, так как выход из системы все равно будет отключаться. Я просто игнорирую исключение в этом случае.

Другие вопросы по тегам