На стороне сервера я пытаюсь изящно закрыть подключенный сокет. Я знаю, правильная последовательность событий на сокете должна быть:
Отключение сокета с опцией SocketShutdown.Send
цикл / ожидание, пока получение сокета вернется с 0 байтами
розетка Закрыть
У меня есть несколько вопросов:
что если Socket.Receive никогда не вернется (с 0 байтами)? мы застрянем, пытаясь закрыть сокет навсегда?
всякий раз, когда я вызываю Close на сервере, Клиент всегда получает исключение «существующее соединение было принудительно закрыто удаленным хостом» на их конце. как я могу уведомить клиента об этом закрытии "изящно"?
на сервере, если я использую вызовы Async Begin / EndReceive, всякий раз, когда я вызываю Close в сокете, это ВСЕГДА приводит к исключению ObjectDisposedException в потоке Begin / EndReceive. Нет ли способа закрыть сокет без возникновения этого исключения?