2013-01-13 12 views
5

मैं नामित पाइप के साथ शुरू कर रहा हूं और उन्हें दो स्थानीय प्रक्रियाओं के बीच आईपीसी के लिए उपयोग करने की आवश्यकता है। मेरे पास ओवरलैप मोड को अनब्लॉक करने में पाइप का उपयोग कर सर्वर और क्लाइंट प्रक्रिया दोनों हैं।गैर-अवरुद्ध कनेक्टनामयुक्त पाइप ईवेंट संकेत नहीं मिला

सबकुछ ठीक काम करता है (सर्वर को क्लाइंट द्वारा भेजे गए स्ट्रिंग को सफलतापूर्वक प्राप्त होता है) सिवाय इसके कि ओवरराप्लेड संरचना के माध्यम से ConnectNamedPipe() में दी गई घटना को अपेक्षित के रूप में संकेत नहीं दिया जा रहा है (क्लाइंट कनेक्ट होने पर संकेत मिलता है)।

जबकि सर्वर को WaitForSingleObject() पर अवरुद्ध किया गया है, तो पाइप से जुड़े क्लाइंट प्रक्रिया को कॉल करें, अपना डेटा भेजा और अभी तक समाप्त हो गया है, ईवेंट को संकेत नहीं दिया गया है। मैं क्या खो रहा हूँ?

सर्वर कोड:

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

क्या यह ERROR_IO_PENDING प्राप्त करता है? (आप बेहतर ढंग से इस मामले को अलग करना चाहते हैं, या आपको प्रक्रिया से संलग्न होना है और यह देखना है कि यह कहां इंतजार कर रहा है) –

उत्तर

10

आप उपयोग नहीं करना चाहिए (बहिष्कृत) PIPE_NOWAIT एक साथ ओवरलैप मोड के साथ। PIPE_NOWAITConnectNamedPipe बनाता है यदि कोई ग्राहक कनेक्ट नहीं है तो तुरंत ERROR_PIPE_LISTENING लौटाएं; ओवरलैप I/O बस नहीं होता है, और घटना की प्रतीक्षा बेकार है।

या तो आप PIPE_NOWAIT सेट करते हैं और सफलता तक पाइप को समय-समय पर मतदान करते हैं, या आप FILE_FLAG_OVERLAPPED सेट करते हैं और पूरा करने के लिए चेक/प्रतीक्षा करने के लिए किसी ईवेंट का उपयोग करते हैं।

+1

मेरी समस्या को ठीक किया गया। आपको बहुत - बहुत धन्यवाद! माइक्रोसॉफ्ट को वास्तव में इस पर प्रलेखन अद्यतन करना चाहिए। – links77

+0

CreateNamedPipe पर एमएसडीएन पेज से: "ध्यान दें कि माइक्रोसॉफ्ट लैन प्रबंधक संस्करण 2.0 के साथ संगतता के लिए नॉनब्लॉकिंग मोड समर्थित है और नामित पाइप के साथ एसिंक्रोनस I/O प्राप्त करने के लिए इसका उपयोग नहीं किया जाना चाहिए।" –

+0

एसिंक्रोनस मोड में ConnectNamedPipe का उपयोग न करने के बारे में चेतावनियां हैं। इसके बजाय पढ़ने के लिए प्रतीक्षा करने के लिए 'ओवरप्लेप्ड 'संरचना को' रीडफाइल 'में पास किया जा सकता है। – Steve

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