Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] "Блокировка" WriteFile IOCP уведомления 22.08.07 04:47 Число просмотров: 2548
Автор: void <Grebnev Valery> Статус: Elderman
|
Есть простенький сервер на пайпах на IOCP. Сервер отправляет клиенту асинхронный:
::WriteFile(m_device, m_buffer, (DWORD) _tcslen(m_buffer)+1, NULL, (OVERLAPPED_PERCLIENT*) pointerOverlapped));
Если клиент прочитает только часть из _tcslen(m_buffer)+1,
то GetQueuedCompletionStatus(hIOCP, &dwNumBytes, &CompKey, &pOverlapped, PIPE_TIMEOUT)не вернёт соответствующий риквест на серверной стороне. Запрос сервера ::WriteFile так и останется в очереди IOCP, пока все _tcslen(m_buffer)+1 не будут вычитаны клиентом.
Таким образом возникает "подвисший клиент", который находится в памяти сервера и очереди IOCP. Сервер никогда не узнает о таких подвисших пайпах, поскольку GetQueuedCompletionStatus по тайм ауту возврашает только OVERLAPPED * == NULL.
Если клиент создаёт тысячи таких "подвисших" пайпов, то сервер становится жертвой - он никогда не узнает, что клиент ничего ни делает.
Вопрос, как быть? Как определить, что "плохой клиент" не хочет читать данный, и надо прибить пайп.
|
- [Win32] "Блокировка" WriteFile IOCP уведомления - void 22.08.07 04:47 [2548]
|
|
|