Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
В принципе проблема в том, что получив error_io_pending мы... 25.08.07 05:03 Число просмотров: 5653
Автор: void <Grebnev Valery> Статус: Elderman
|
>Что будет,
> если получить на клиенте не все данные, и закрыть пайп > (убить процесс)? Я надеюсь что на сервере вернется ошибка > на GetQueuedCompletionStatus с dwNumBytes == 0. Если так, > то не вижу проблемы.
В принципе проблема в том, что получив ERROR_IO_PENDING мы не делаем различия между плохим и хорошим клиентом. Для обоих мы закрываем пайп на серверной стороне. Если от хорошего клиента (который не завершил чтение по уважительным причинам) появляется ошибка ERROR_IO_PENDING, то надо как-то попытаться подождать ещё чуток, пока не будет получена уведомление о completion. Пока не знаю, как это сделать просто. Но ты прав - самое простое и безопасное для сервера - это закрыть на сервере пайп клиента подчистив затем PER_OVERLAPPED_PERCLIENT данные.
> Я надеюсь что на сервере вернется ошибка > на GetQueuedCompletionStatus с dwNumBytes == 0. Если так, > то не вижу проблемы.
Это не так. GetQueuedCompletionStatus не вернётся в этом случае. И это как раз та проблема, из-за которой вся эта нитка постингов. Это потому, что GetQueuedCompletionStatus поджигается только по: или IO copmletion, или IOCP error, или WAIT_TIMEOUT.
Поэтому есть только один шанс - незавершённое клиентом чтение необходимо ловить сразу же по FALSE == Server->WriteFile() и затем по ERROR_IO_PENDING == GetLastError()
> Кстати, почему именно пайпы а не сокеты?
Не знаю... Число клиентов заведомо невелико. Всё только в локальной сети. И не будет ли легче в Windows domain обеспечить аутинтификацию клиента используя пайп? С сокетами - не придётся ли наворачивать поверх? Могу ошибаться.
|
|
|