Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Да вроде обычное дело. Пайп комуникации, например,... 24.08.07 06:37 Число просмотров: 3271
Автор: void <Grebnev Valery> Статус: Elderman
|
> Не знаю, по-моему использование IOCP для пайпов вообще > выглядит не совсем логичным :) Да вроде обычное дело. Пайп комуникации, например, поддерживают MSSQL, MySQL.
> > Даже более того, если клиент теперь будет слать > > сообщения серверу, то сервер о них не узнает, т.к. он > > слушает по завершению completion WriteFile: > А если ReadFile параллельно запостить?
Нельзя, поскольку это сломает синхронизацию последовательности риквест/ответ прикладного протокола. Вернее нет гарантии, что этого не будет. При последовательностиасинхронныхвызовов ReadFile(...); WriteFile(...) драйвет может вначале выполнить WriteFile(...) а затем ReadFile(...). Это потому, что в IO очередиасинхронныезапросы не обрабатываются FIFO. Поэтому выполнив WriteFile(...), надо ждать completion IO. А только затем делать ReadFile(...).
Если всё же после неудачного асинхронного WriteFile в данной задаче делать ReadFile(...), то может так? :
f ( ! pClient->WriteFile() ) {
DWORD dwError = GetLastError();
if ( dwError == ERROR_INVALID_USER_BUFFER|dwError == ERROR_NOT_ENOUGH_MEMORY)
{
delete pClient;
::InterlockedDecrement(&g_nClients);
::SetEvent( g_evtCloseClient );
_tprintf(_T("Closing the client pipe...(dwError %d).\n"), dwError);
} else if (dwError == ERROR_IO_PENDING ) {
_tprintf(_T("Process a failed completed I/O request (ERROR_IO_PENDING, dwError %d).\n"), dwError);
if (! CancelIo( pClient->GetDevice() ))
{
_tprintf(_T("Failed canceling pending I/O. Close the client pipe\n"));
delete pClient;
::InterlockedDecrement(&g_nClients);
::SetEvent( g_evtCloseClient );
}
else {
_tprintf(_T("Cancel the client pending I/O.\n"));
pClient->ReadFile();
}
} else { _tprintf(_T("Process a failed completed I/O request (dwError %d).\n"), dwError);
}
}
Здесь pClient->ReadFile() делается, если отменены все pending IO для данного пайп. Иначе -удаляем клиента.
|
|
|