GetQueuedCompletionStatus возвращает ERROR_NETNAME_DELETED при удаленном закрытии сокета - PullRequest
0 голосов
/ 29 марта 2011

Я пишу небольшой сервер-клиент с использованием порта завершения ввода-вывода.

Я успешно подключил сервер и клиент через AcceptEx через мой порт завершения.После подключения клиента клиентский сокет связывается с портом завершения, и вызывается перекрывающийся вызов WSARecv для этого сокета.

Все работает нормально, пока я не закрою клиентскую тестовую программу.GetQueuedCompletionStatus() возвращает FALSE и GetLastError возвращает

ERROR_NETNAME_DELETED

, что имеет смысл для меня (после того, как я прочитал описание в MSDN).

Но моя проблема в том, что я думал, что вызов GetQueuedCompletionStatus вернет мне пакет, указывающий на сбой из-за закрытия сокета, потому что WSARecv вернет соответствующее возвращаемое значение.Так как это не тот случай, я не знаю, какой сокет клиента вызвал ошибку, и я не могу действовать так, как мне нужно (освобождение структур, очистка для этого конкретного соединения и т. Д.) ...

Любые предложения покак решить эту проблему, или подсказки?

Спасибо:)

РЕДАКТИРОВАТЬ: http://codepad.org/WeYINasO <- код ответственен ... "ошибка" происходит в начале первых функцийцикл while (вызов <code>GetCompletionStatus(), который является только оболочкой для GetQueuedCompletionStatus (), работает нормально в других случаях) [Разместил это там, потому что здесь он выглядит дерьмово и грязно]

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

Вот сценарии, на которые нужно смотреть при звонке GetQueuedCompletionStatus:

  • GetQueuedCompletionStatus возвращает TRUE: Получен пакет успешного завершения, все параметры out заполнены.
  • GetQueuedCompletionStatus возвращает FALSE, lpOverlapped == NULL: Пакет не был снят с очереди. Другие выходные параметры содержат неопределенные значения.
  • GetQueuedCompletionStatus возвращает FALSE, lpOverlapped != NULL: Функция забраковала неудачный пакет завершения. Код ошибки доступен через GetLastError.

Чтобы ответить на ваш вопрос, когда GetQueuedCompletionStatus возвращает FALSE и lpOverlapped != NULL, произошел сбой завершения ввода-вывода. Вам нужно беспокоиться о значении lpOverlapped.

1 голос
/ 26 января 2012

Я знаю, что это старый вопрос, но я нашел эту страницу, бесполезно ища подробности о ERROR_NETNAME_DELETED.Это ошибка, которую я получаю при выполнении перекрытия Readfile().

После некоторой отладки выяснилось, что проблема была вызвана программой, которая записывала в сокет, но забыла вызвать closesocket() перед использованиемExitProcess() (из-за проблем со сборкой мусора).Вызов CloseHandle() не предотвратил ошибку, равно как и добавление WSACleanup() до ExitProcess().Однако добавление короткого сна перед выходом клиента предотвратило ошибку.Возможно, избежание ExitProcess() также предотвратило бы проблему.

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

Не думаю, что это будетпроблема в Unix, где сокеты - это просто обычные файловые дескрипторы.

...