Re[3]: ConnectNamedPipe не реагирует на подключение
От: Jolly Roger  
Дата: 12.06.10 06:55
Оценка: +1
Здравствуйте, Northsoft, Вы писали:

N>добавил вызов SetNamedPipeHandleState,


Зачем?

N>WriteFile не говорит об ошибке, но почему-то сообщения не доходят, как с клиента ,так и с сервера.


Воля Ваша, что-то у Вас там совсем странное творится. Подготовьте минимальный компилируемый пример, воспроизводящий ситуацию, и выложите для скачивания. Или хотя-бы опубликуйте здесь, но только без купюр, со всеми обработчиками ошибок, какие есть.
"Нормальные герои всегда идут в обход!"
ConnectNamedPipe не реагирует на подключение
От: Northsoft  
Дата: 09.06.10 13:50
Оценка:
Доброго всем дня. После вызова 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 */
}


У всех системных вызовов смотрится возвращаемое значение, там ничего необычного.
Как вы считаете, что здесь может быть не так?
Re: ConnectNamedPipe не реагирует на подключение
От: Jolly Roger  
Дата: 09.06.10 15:07
Оценка:
Здравствуйте, Northsoft, Вы писали:

На первый взгляд нормально, разве что немного смущает пара моментов. Во-первых, флаг PIPE_NOWAIT. Для асинхрона он не нужен, да и вообще не рекомендуется к применению. Лучше-бы убрать, хуже точно не будет Во-вторых, настораживает глобальность переменной ovlGlobal. Она у Вас точно не участвует одновременно ещё в каком-нибудь вызове?
"Нормальные герои всегда идут в обход!"
Re[2]: ConnectNamedPipe не реагирует на подключение
От: Northsoft  
Дата: 09.06.10 15:51
Оценка:
JR>Во-первых, флаг PIPE_NOWAIT. Для асинхрона он не нужен, да и вообще не рекомендуется к применению. Лучше-бы убрать, хуже точно не будет
Попробую его убрать, спасибо.

JR>Во-вторых, настораживает глобальность переменной ovlGlobal. Она у Вас точно не участвует одновременно ещё в каком-нибудь вызове?

Точно не участвует.
Re[2]: ConnectNamedPipe не реагирует на подключение
От: Northsoft  
Дата: 11.06.10 15:38
Оценка:
Убрал PIPE_NOWAIT и добавил вызов SetNamedPipeHandleState, теперь у меня сервер реагирует на подключение клиента, но не реагирует на сообщения. WriteFile не говорит об ошибке, но почему-то сообщения не доходят, как с клиента ,так и с сервера.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.