Не получен ответ от сервера именованных каналов - PullRequest
1 голос
/ 06 сентября 2010

Я создал NamedPipe внутри службы Windows и запускаю службу вручную или при запуске системы.

РЕДАКТИРОВАТЬ:

lpszPipename = TEXT("\\\\.\\pipe\\1stPipe"); 
OVERLAPPED m_OverLaped;
HANDLE hEvent;

hPipe=CreateNamedPipe (lpszPipename,
                       PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
                       PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT,
                       PIPE_UNLIMITED_INSTANCES,BUFSIZE,
                       BUFSIZE,0,NULL);   

m_OverLaped.hEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
m_OverLaped.Internal=0;
m_OverLaped.InternalHigh=0;
m_OverLaped.Offset=0;
m_OverLaped.OffsetHigh=0;

ConnectNamedPipe(hPipe,&m_OverLaped);

Теперь я хочу получить доступ к именованному каналу, написать некоторое сообщение и ответ обратно.

LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\1stPipe"); 

OVERLAPPED m_OverLaped;
m_OverLaped.hEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
m_OverLaped.Internal=0;
m_OverLaped.InternalHigh=0;
m_OverLaped.Offset=0;
m_OverLaped.OffsetHigh=0;

hPipe=CreateFile (lpszPipename,            // Gets the Pipename
                  GENERIC_READ | GENERIC_WRITE,// Client only writes to this pipe.
                  0,                       // Do not share this pipe with others.
                  NULL,                    // Do not inherit security.
                  OPEN_EXISTING,           // Pipe must exist.
                  FILE_ATTRIBUTE_NORMAL,   // I have no special requirements on
                                           //file attributes
                  NULL);  

dwMode = PIPE_READMODE_MESSAGE;

fSuccess = SetNamedPipeHandleState (hPipe,    // pipe handle 
                                    &dwMode,  // new pipe mode 
                                    NULL,     // don't set maximum bytes 
                                    NULL);    // don't set maximum time 
fSuccess = TransactNamedPipe (hPipe,                  // pipe handle 
                              lpszWrite,              // message to server
                              (lstrlen(lpszWrite)+1)*sizeof(TCHAR),//message length 
                              chReadBuf,              // buffer to receive reply
                              BUFSIZE*sizeof(TCHAR),  // size of read buffer
                              &cbRead,                // bytes read
                              &m_OverLaped); 
fSuccess = ReadFile (hPipe,                 // pipe handle 
                     chReadBuf,             // buffer to receive reply 
                     BUFSIZE*sizeof(TCHAR), // size of buffer 
                     &cbRead,               // number of bytes read 
                     &m_OverLaped);         // overlapped 

Я опустил коды проверки ошибок, чтобы сделать их читаемыми здесь.Я застреваю на долгое (может быть бесконечное) время при выполнении TransactNamedPipe.Я должен установить некоторые параметры неправильно, но я пробовал параметры, указанные в MSDN.

Ответы [ 2 ]

2 голосов
/ 06 сентября 2010
m_OverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
...
ConnectNamedPipe(hPipe, &m_OverLaped);

Поскольку канал создается с флагом FILE_FLAG_OVERLAPPED, необходимо передать параметр LPOVERLAPPED каждому вызову ввода-вывода канала (включая TransactNamedPipe). Если функция возвращает FALSE, а GetLastError возвращает ERROR_IO_PENDING, дождитесь m_OverLaped.hEvent - когда он установлен, операция завершена.

1 голос
/ 06 сентября 2010

Для начала

m_OverLaped.hEvent=hPipe;

Неправильно, hEvent должен быть установлен на событие, которое вы создали, а не на канал.Перед чтением нужно позвонить:

WaitForSingleObject( oOverlap.hEvent, 

, а затем:

GetOverlappedResult()

Труба работает в режиме без перекрытия?

...