का उपयोग करके नामित पाइप्स को कार्यान्वित करना मैं सी ++ में नामित पाइप को लागू करने की कोशिश कर रहा हूं, लेकिन या तो मेरा पाठक कुछ भी नहीं पढ़ रहा है, या मेरा लेखक कुछ भी लिख रहा है (या दोनों)। यहाँ मेरी पाठक है:सी ++: विन 32 एपीआई
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";
}
यह सही लगता है: यहाँ
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";
}
और मेरे लेखक है? पाठक में numRead हमेशा 0 है, किसी कारण से, और यह 1024 -54 के कुछ भी नहीं (कुछ अजीब मैं चरित्र) पढ़ता है।
समाधान:
रीडर (सर्वर):
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);
}
लेखक (ग्राहक):
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;
सर्वर ब्लॉक जब तक यह एक जुड़ा ग्राहक हो जाता है, पढ़ता है क्या ग्राहक लिखते हैं, और फिर एक नए कनेक्शन, विज्ञापन infinitum के लिए खुद को सेट अप। सभी को मदद के लिए धन्यवाद!
आपको जोर देना चाहिए कि पाइप हैंडल उन पर काम करने से पहले मान्य हैं। आम तौर पर, आपके कोड में कुछ और मजबूती आपको समस्याओं को खोजने और डीबग करने में मदद करने में एक लंबा सफर तय करेगी। – fbrereto
जांचें कि रीडफाइल/लिखित रेखा का परिणाम 'TRUE' है या नहीं। शायद अमान्य पाइप जैसे पढ़ने/लिखने में त्रुटि हो रही है। – AndiDog
यदि यह मान्य है या नहीं, तो हैंडल की जांच करें, फिर GetLastError और WriteFile के आउटपुट – Andrey