2010-04-14 23 views
17

Tôi đang cố gắng triển khai các đường ống có tên trong C++, nhưng trình đọc của tôi không đọc bất kỳ thứ gì hoặc nhà văn của tôi không viết gì cả (hoặc cả hai). Dưới đây là độc giả của tôi:C++: Thực hiện các tên được đặt tên bằng cách sử dụng API Win32

int main() 
{ 
    HANDLE pipe = CreateFile(GetPipeName(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); 

    char data[1024]; 
    DWORD numRead = 1; 

    while (numRead >= 0) 
    { 
     ReadFile(pipe, data, 1024, &numRead, NULL); 

     if (numRead > 0) 
      cout << data; 
    } 

    return 0; 
} 

LPCWSTR GetPipeName() 
{ 
    return L"\\\\.\\pipe\\LogPipe"; 
} 

Và đây là nhà văn của tôi:

int main() 
{ 
    HANDLE pipe = CreateFile(GetPipeName(), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); 

    string message = "Hi"; 
    WriteFile(pipe, message.c_str(), message.length() + 1, NULL, NULL); 

    return 0; 
} 

LPCWSTR GetPipeName() 
{ 
    return L"\\\\.\\pipe\\LogPipe"; 
} 

Liệu có đúng không? numRead trong đầu đọc luôn là 0, vì lý do nào đó, và nó không đọc gì ngoài 1024 -54 (một số ký tự lạ).

Giải pháp:

Reader (Server):

while (true) 
{ 
    HANDLE pipe = CreateNamedPipe(GetPipeName(), PIPE_ACCESS_INBOUND | PIPE_ACCESS_OUTBOUND , PIPE_WAIT, 1, 1024, 1024, 120 * 1000, NULL); 

    if (pipe == INVALID_HANDLE_VALUE) 
    { 
     cout << "Error: " << GetLastError(); 
    } 

    char data[1024]; 
    DWORD numRead; 

    ConnectNamedPipe(pipe, NULL); 

    ReadFile(pipe, data, 1024, &numRead, NULL); 

    if (numRead > 0) 
     cout << data << endl; 

    CloseHandle(pipe); 
} 

Writer (client):

HANDLE pipe = CreateFile(GetPipeName(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 

if (pipe == INVALID_HANDLE_VALUE) 
{ 
    cout << "Error: " << GetLastError(); 
} 

string message = "Hi"; 

cout << message.length(); 

DWORD numWritten; 
WriteFile(pipe, message.c_str(), message.length(), &numWritten, NULL); 

return 0; 

Các khối máy chủ cho đến khi nó được một khách hàng kết nối, đọc những gì khách hàng viết, và sau đó thiết lập chính nó cho một kết nối mới, quảng cáo vô hạn. Cảm ơn sự giúp đỡ, tất cả!

+1

Bạn nên khẳng định các tay cầm ống có giá trị trước khi thao tác trên chúng. Nói chung, một số mạnh mẽ hơn trong mã của bạn sẽ đi một chặng đường dài trong việc giúp bạn khám phá và gỡ lỗi các vấn đề. – fbrereto

+1

Kiểm tra xem kết quả của ReadFile/WriteLine có phải là 'TRUE' hay không. Có thể có lỗi khi đọc/ghi, chẳng hạn như đường ống không hợp lệ. – AndiDog

+1

kiểm tra HANDLE nếu nó hợp lệ hay không, sau đó sử dụng GetLastError và đầu ra của WriteFile – Andrey

Trả lời

12

Bạn phải sử dụng CreateNamedPipe() để tạo đầu máy chủ của một đường ống có tên. Hãy chắc chắn để chỉ định một kích thước bộ đệm khác 0, không (được tài liệu bởi MSDN là 'sử dụng kích thước bộ đệm mặc định của hệ thống') không hoạt động. MSDN có decent samples cho máy khách đa luồng & máy chủ.

11

Máy khách ống có tên có thể mở ống có tên là CreateFile - nhưng máy chủ đường ống có tên cần sử dụng CreateNamedPipe để tạo đường ống có tên. Sau khi tạo đường ống có tên, máy chủ sử dụng ConnectNamedPipe để chờ khách hàng kết nối. Chỉ sau khách hàng đã kết nối nếu máy chủ thực hiện chặn chặn như cuộc gọi của bạn tới ReadFile.

Các vấn đề liên quan