c # /. Net Socket.Shutdown - PullRequest
       18

c # /. Net Socket.Shutdown

5 голосов
/ 25 февраля 2009

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

3 голосов
/ 25 февраля 2009

На основе Socket.Disconnect

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

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

2 голосов
/ 04 августа 2009

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

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

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

socket.Shutdown(SocketShutdown.Both);
socket.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...