Named pipes, нотификация о пришедших данных
От: johny5 Новая Зеландия
Дата: 12.01.09 08:26
Оценка:
Всем привет.

Хочу реализовать дуплекс IPC, основываясь на Named Pipes с вот таким совсем простым интерфейсом:
struct IPC
{
  bool create_new_pipe(const char* unique_name);
  bool connect_to_existed_pipe(const char* unique_name);

  void set_callback(...)
  bool read(..data..)
  bool write(..data..)
};


Никак не могу сделать нотификацию о получении данных по named pipe каналу. Есть вариант создавать Event, создавать для него отдельный поток в котором будет висеть WaitForSingleObject и далее по срабатыванию Event-а посылать сообщение уже основному потоку (правда до конца этот вариант тоже не понял).

Но меня больше интересует нотификация через ReadFileEx. Вместо взведения Event он предлагает вызов callback функции в контексте вызывающего потока, что очень удобно.
Однако после (на стороне клиента)


HANDLE hPipe = CreateFileA(
      fname.c_str()
    , GENERIC_READ | GENERIC_WRITE
    , 0        //    no sharing
    , NULL     //    default security attributes
    , OPEN_EXISTING
    , 0        //    default attributes 
    , NULL     //    no template file 
);

DWORD dwMode = PIPE_READMODE_MESSAGE | PIPE_NOWAIT;//| PIPE_WAIT; (1)
SetNamedPipeHandleState(hPipe, &dwMode, NULL, NULL);

char buf[100];

//    asynchronous data arrival monitoring
_ASSERT( sizeof(OVERLAPPED) == sizeof overlapped_buf );
memset(&overlapped_buf, 0, sizeof overlapped_buf);
ReadFileEx(hPipe, buf, 100, (OVERLAPPED*)&overlapped_buf, &zzFileIOCompletionRoutine);


ReadFileEx возвращает FALSE. Если же поменять в (1) PIPE_NOWAIT на PIPE_WAIT — ReadFileEx вообще блокируется.


Named Pipe на стороне сервера создаётся вот так:
HANDLE hPipe = CreateNamedPipeA( 
      fname.c_str()                    // pipe name
    , PIPE_ACCESS_DUPLEX            // read/write access
        | FILE_FLAG_OVERLAPPED        // overlapped mode
    , PIPE_TYPE_MESSAGE                // message-type pipe
        | PIPE_READMODE_MESSAGE        // message read mode
//        | PIPE_WAIT                    // blocking mode
        | PIPE_NOWAIT                // blocking mode
    , 1 //PIPE_UNLIMITED_INSTANCES    // number of instances
    , 100000                        // output buffer size
    , 100000                        // input buffer size
    , 5000                            // client time-out
    , NULL);                        // default security attributes


Что тут можно сделать?
named pipes нотификация
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.