Zaczynam od nazwanych potoków i trzeba ich używać do IPC między dwoma procesami lokalnymi. Mam zarówno proces serwera, jak i klienta, używając potoku w niezablokowanym trybie nakładania.Nie blokujące zdarzenie ConnectNamedPipe nie jest sygnalizowane
Wszystko działa poprawnie (serwer pomyślnie odbiera ciąg wysyłany przez klienta), z tym że zdarzenie przekazywane do obiektu ConnectNamedPipe() przez strukturę OVERLAPPED nie jest sygnalizowane zgodnie z oczekiwaniami (sygnalizowane, gdy klient łączy się).
Podczas gdy serwer jest zablokowany w wywołaniu WaitForSingleObject(), proces klienta podłączony do potoku, wysłał swoje dane i został zakończony, ale zdarzenie nie zostało zasygnalizowane. czego mi brakuje?
kod serwera:
HANDLE hPipe = ::CreateNamedPipeW(
L"\\\\.\\pipe\\ThePipe",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_NOWAIT,
1,
4096,
4096,
100,
nullptr);
OVERLAPPED ov = {0};
ov.hEvent = ::CreateEventW(nullptr, TRUE, FALSE, nullptr);
BOOL retVal = ::ConnectNamedPipe(hPipe, &ov);
if (retVal == 0)
{
DWORD err = ::GetLastError();
if (err == ERROR_IO_PENDING)
{
::WaitForSingleObject(ov.hEvent, 30000);
}
if (err == ERROR_PIPE_LISTENING)
{
::WaitForSingleObject(ov.hEvent, 30000); // this blocks until time-out???
}
}
Czy odbiera ERROR_IO_PENDING? (lepiej uczynić tę sprawę łatwą do rozróżnienia lub musisz dołączyć do procesu i zobaczyć, gdzie czeka) –