Делаю службу, принимающую и передающую данные через именованный канал.
Пока сделал так: канал открывается, передается порция данных и канал закрывается.
Но хотелось бы держать канал открытым. Возникает проблема - пока канал открыт, другой процесс его открыть не может.
Знаю, что канал может быть многопоточным, но вот примера реализации не могу найти.
Сейчас сделано так:
hPipe = CreateNamedPipe(lpszPipeName,
FILE_FLAG_OVERLAPPED|PIPE_ACCESS_DUPLEX, // pipe open mode
PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT, // pipe IO type
1, // number of instances
0, // size of outbuf (0 == allocate as necessary)
0, // size of inbuf
1000, // default time-out value
&sa); // security attributes
if (hPipe == INVALID_HANDLE_VALUE){
AddToMessageLog(TEXT("Unable to create named pipe"));
goto cleanup;
}
while(1)
{
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvents[1];
ResetEvent( hEvents[1] );
ConnectNamedPipe(hPipe, &os); // accept()
if(GetLastError()==ERROR_IO_PENDING){
dwWait = WaitForMultipleObjects(2,hEvents,FALSE,INFINITE);
if(dwWait != WAIT_OBJECT_0+1) break;
}
memset( &os, 0, sizeof(OVERLAPPED) );
os.hEvent = hEvents[1];
ResetEvent(hEvents[1]);
memset(szIn,0,sizeof(szIn));
bRet = ReadFile(hPipe,szIn,sizeof(szIn),&cbRead,&os);
// тут всякие неинтересные строки...
//
DisconnectNamedPipe(hPipe);
}
Тут есть цикл, который ждет входящего соедининия, обрабатывает его и возвращается к ожиданию.
Как сделать в случае если nMaxInstances >1? Сделать цикл, который ждет, порождает поток для нового соединения и возвращается к ожиданию?