2013-01-13 44 views
5

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??? 
    } 
} 
+0

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) –

Trả lời

10

Bạn không nên sử dụng (phản đối) PIPE_NOWAIT cùng với chế độ chồng chéo. PIPE_NOWAIT làm cho ConnectNamedPipe trả lại ngay ERROR_PIPE_LISTENING nếu không có khách hàng nào được kết nối; chồng chéo I/O chỉ không xảy ra, và chờ đợi cho sự kiện là vô ích.

Hoặc bạn đặt PIPE_NOWAIT và thăm dò ý kiến ​​của đường ống định kỳ cho đến khi thành công hoặc bạn đặt FILE_FLAG_OVERLAPPED và sử dụng sự kiện để kiểm tra/chờ hoàn thành.

+1

Sửa lỗi của tôi. Cảm ơn bạn rất nhiều! Microsoft thực sự nên cập nhật tài liệu về điều này. – links77

+0

Từ trang MSDN trên CreateNamedPipe: "Lưu ý rằng chế độ nonblocking được hỗ trợ để tương thích với Microsoft LAN Manager phiên bản 2.0 và không nên được sử dụng để đạt được I/O không đồng bộ với các đường ống được đặt tên." –

+0

Có cảnh báo về việc không sử dụng ConnectNamedPipe ở chế độ không đồng bộ. Thay vào đó, một cấu trúc 'OVERLAPPED' có thể được truyền vào' ReadFile' để chờ đọc. – Steve