Я понимаю, что этот тип вопроса имеет длинную историю, но способ, которым я использую это, должен быть правильным .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 ().
Есть идеи?