Tôi bắt đầu với các đường ống có tên và cần sử dụng chúng cho IPC giữa hai quy trình cục bộ. Tôi có cả quá trình máy chủ và máy khách bằng cách sử dụng đường ống trong chế độ chồng chéo không bị chặn.Sự kiện ConnectNamedPipe không chặn không nhận được tín hiệu
Mọi thứ hoạt động tốt (máy chủ nhận thành công chuỗi được khách hàng gửi) trừ khi sự kiện được chuyển đến ConnectNamedPipe() qua cấu trúc OVERLAPPED không được báo hiệu như mong đợi (được báo hiệu khi khách hàng kết nối).
Trong khi máy chủ bị chặn trên WaitForSingleObject() gọi quá trình khách hàng kết nối với đường ống, gửi dữ liệu của nó và chấm dứt nhưng sự kiện không được báo hiệu. Tôi đang thiếu gì?
đang Server:
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???
}
}
Nó có nhận được ERROR_IO_PENDING không? (bạn nên làm cho trường hợp này dễ phân biệt, hoặc bạn phải đính kèm để xử lý và xem nó chờ ở đâu) –