Доброго всем дня. После вызова CreateNamedPipe с указанием асинхронного режима создаю событие, записываю его в Overlapped-структуру, ответвляюсь в новый поток и там вызываю WaitForSingleObject для ожидания подключения клиента. Но WaitForSingleObject не реагирует на подключение клиента.
Сервер:
OVERLAPPED ovlGlobal;
HANDLE hPipeGlobal;
unsigned long int __stdcall ConnectNamedPipeThreadProc(void *parameter){
ovlGlobal.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
ConnectNamedPipe(hPipeGlobal,&ovlGlobal);
WaitForSingleObject(ovlGlobal.hEvent,INFINITE);
/* зедсь находится вызов ReadFileEx */
}
void CreateButtonClick(){
wchar_t pipepath[600]=L"\\\\.\\pipe\\123123";
hPipeGlobal = CreateNamedPipe(pipepath,
PIPE_ACCESS_DUPLEX|FILE_FLAG_FIRST_PIPE_INSTANCE|FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE|PIPE_NOWAIT,
PIPE_UNLIMITED_INSTANCES,
64*1024,
64*1024,
60*1000,
NULL);
CreateThread(NULL,0,ConnectNamedPipeThreadProc,NULL,0,NULL);
}
Клиент:
void ConnectButtonClick(){
wchar_t pipename[600]=L"\\\\.\\pipe\\123123";
hPipeGlobal = CreateFile(pipepath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
/* здесь находится вызов ReadFileEx */
}
У всех системных вызовов смотрится возвращаемое значение, там ничего необычного.
Как вы считаете, что здесь может быть не так?
Здравствуйте, Northsoft, Вы писали:
На первый взгляд нормально, разве что немного смущает пара моментов. Во-первых, флаг PIPE_NOWAIT. Для асинхрона он не нужен, да и вообще не рекомендуется к применению. Лучше-бы убрать, хуже точно не будет

Во-вторых, настораживает глобальность переменной ovlGlobal. Она у Вас точно не участвует одновременно ещё в каком-нибудь вызове?
JR>Во-первых, флаг PIPE_NOWAIT. Для асинхрона он не нужен, да и вообще не рекомендуется к применению. Лучше-бы убрать, хуже точно не будет
Попробую его убрать, спасибо.
JR>Во-вторых, настораживает глобальность переменной ovlGlobal. Она у Вас точно не участвует одновременно ещё в каком-нибудь вызове?
Точно не участвует.
Убрал PIPE_NOWAIT и добавил вызов SetNamedPipeHandleState, теперь у меня сервер реагирует на подключение клиента, но не реагирует на сообщения. WriteFile не говорит об ошибке, но почему-то сообщения не доходят, как с клиента ,так и с сервера.