Пайпы: ConnectNamedPipe не реагирует на подключение
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.141] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google
Пайпы: ConnectNamedPipe не реагирует на подключение
|
Сообщ.
#1
,
|
|
|
|
Доброго всем дня. После вызова 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 */ } У всех системных вызовов смотрится возвращаемое значение, там ничего необычного. Как вы считаете, что здесь может быть не так? |
|
Сообщ.
#2
,
|
|
|
|
Цитата Northsoft @ У всех системных вызовов смотрится возвращаемое значение, там ничего необычного. Хорошо было бы "все обычное" привести здесь. А еще лучше смотреть эти значения не только в отладчике, а непосредственно в коде. Странно как-то просто, если смотрится - то почему в этом примере не отражено?.. ![]() Цитата Northsoft @ Как вы считаете, что здесь может быть не так? Я считаю, что нужно добавить инициализацию ![]() ![]() OVERLAPPED ovlGlobal = { 0 }; И, кстати, зачем она глобальная? Тот же вопрос относительно дескриптора канала. Лучше его в поток передавать параметром. |
|
Сообщ.
#3
,
|
|
|
|
CreateNamedPipe удачно проходит?
А что касаемо самого ожидания присоединения клиента, то лучше всёж проверять результаты выполняемых системных вызовов.. ![]() ![]() BOOL fConnect = ConnectNamedPipe(hPipeGlobal,&ovlGlobal); if( !fConnect && GetLastError() == ERROR_IO_PENDING) fConnect = WaitForSingleObject(ovlGlobal.hEvent,INFINITE) == WAIT_OBJECT_0; if( fConnect) { /* зедсь находится вызов ReadFileEx */ } else { // Почему всё так плохо... } И проверяй удачу/неудачу создания файлов/потоков/событий/etc, и прочищай структуры перед их использованием в системных вызовах. Это избавит тебя от непредсказуемого поведения твоего кода и позволит намного быстрей находить место ошибки |
|
Сообщ.
#4
,
|
|
|
|
Сервер:
![]() ![]() unsigned long int __stdcall ConnectNamedPipeThreadProc(void *parameter){ ovlGlobal.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); /* возвращено значение 0xDC */ ConnectNamedPipe(hPipeGlobal,&ovlGlobal); /* возвращено значение 0, GetLastError()==ERROR_PIPE_LISTENING */ 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); /* возвращено значение 0xD8 */ 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); /* возвращено значение 0xD4 */ /* здесь находится вызов ReadFileEx */ } Насчёт ERROR_PIPE_LISTENING было сказано в MSDN. З.Ы. Обнуление не помогло. |