나는 명명 된 파이프로 시작하고 두 개의 로컬 프로세스 사이에서 IPC를 위해 사용해야합니다. 나는 nonblocking overlapped 모드에서 파이프를 사용하는 서버와 클라이언트 프로세스를 가지고있다.논 블로킹 ConnectNamedPipe 이벤트가 신호를 보내지 않음
OVERLAPPED 구조체를 통해 ConnectNamedPipe()로 전달 된 이벤트가 예상대로 신호를 보내지 않는다는 점을 제외하면 모든 것이 잘 작동합니다 (클라이언트가 보낸 문자열을 클라이언트가 성공적으로 수신함).
서버가 WaitForSingleObject() 호출에서 차단되는 동안 클라이언트 프로세스가 파이프에 연결되어 데이터를 보내고 이벤트가 신호를받지 못하고 종료됩니다. 내가 뭘 놓치고 있니?
서버 코드 : (사용되지 않음) 당신은 사용하지 말아야합니다
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???
}
}
ERROR_IO_PENDING을 받나요? (당신은이 케이스를 구별하기 쉽도록 만들거나, 프로세스에 첨부하여 기다리는 곳을보아야합니다.) –