C#/.NET Socket.Shutdown

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

У меня есть тривиальный демон синхронного IP-сервера, который выполняет простой AcceptSocket, делает некоторые вещи, socket.send, socket.shutdown, socket.close. Мой клиент - еще одно простое приложение на C#, которое выполняет URLDownloadToFile.

То, что происходит, - то, что часть времени URLDownloadToFilefails терпит неудачу с (0x800C0008) .. думает, что его ресурс загрузки не удался.

Моя последовательность действий на стороне сервера:

socket.Shutdown(Both);
socket.Close();

Если я изменю это на

socket.Disconnect();
socket.Close();

(Я открываю выше с sockopt Linger true, время ожидания 5 секунд)

это прекрасно работает

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

В общем, (и это не может быть правильно) это выглядит как закрытие.. убивает любую асинхронную обработку, которая может выполняться из shutdown().

Есть идеи?

2 ответа

На основе Socket.Disconnect

Если вам нужно вызвать Disconnect без предварительного вызова Shutdown, вы можете установить для параметра DontLinger Socket значение false и указать ненулевой интервал времени ожидания, чтобы гарантировать, что данные, поставленные в очередь для исходящей передачи, отправляются. Затем отключите блоки, пока данные не будут отправлены или пока не истечет указанное время ожидания. Если для DontLinger задано значение false и указан нулевой интервал времени ожидания, Close освобождает соединение и автоматически отбрасывает исходящие данные в очереди.

Предполагает, что выключение в лучшем случае не нужно...

Для повторного использования сокета используйте:

socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(true);

Для принудительного закрытия используйте:

socket.Shutdown(SocketShutdown.Both);
socket.Close();
Другие вопросы по тегам