2010-04-14 20 views
17

का उपयोग करके नामित पाइप्स को कार्यान्वित करना मैं सी ++ में नामित पाइप को लागू करने की कोशिश कर रहा हूं, लेकिन या तो मेरा पाठक कुछ भी नहीं पढ़ रहा है, या मेरा लेखक कुछ भी लिख रहा है (या दोनों)। यहाँ मेरी पाठक है:सी ++: विन 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 के लिए खुद को सेट अप। सभी को मदद के लिए धन्यवाद!

+1

आपको जोर देना चाहिए कि पाइप हैंडल उन पर काम करने से पहले मान्य हैं। आम तौर पर, आपके कोड में कुछ और मजबूती आपको समस्याओं को खोजने और डीबग करने में मदद करने में एक लंबा सफर तय करेगी। – fbrereto

+1

जांचें कि रीडफाइल/लिखित रेखा का परिणाम 'TRUE' है या नहीं। शायद अमान्य पाइप जैसे पढ़ने/लिखने में त्रुटि हो रही है। – AndiDog

+1

यदि यह मान्य है या नहीं, तो हैंडल की जांच करें, फिर GetLastError और WriteFile के आउटपुट – Andrey

उत्तर

12

आपको नामित पाइप का सर्वर अंत बनाने के लिए CreateNamedPipe() का उपयोग करना होगा। गैर-शून्य बफर आकार निर्दिष्ट करना सुनिश्चित करें, शून्य (एमएसडीएन द्वारा 'सिस्टम सिस्टम डिफ़ॉल्ट बफर आकार' के रूप में प्रलेखित) काम नहीं करता है। बहु-थ्रेडेड क्लाइंट & सर्वर के लिए एमएसडीएन में decent samples है।

11

एक नामित पाइप क्लाइंट नामित पाइप CreateFile के साथ खोल सकता है - लेकिन नामित पाइप सर्वर को नामित पाइप बनाने के लिए CreateNamedPipe का उपयोग करने की आवश्यकता है। नामित पाइप बनाने के बाद, क्लाइंट कनेक्ट होने के लिए सर्वर ConnectNamedPipe का उपयोग करता है। के बाद क्लाइंट ने कनेक्ट किया है सर्वर को आपके कॉल की तरह अवरुद्ध करना चाहिए ReadFile पर।

संबंधित मुद्दे