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ả!
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
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
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