मैं नामित पाइप के साथ शुरू कर रहा हूं और उन्हें दो स्थानीय प्रक्रियाओं के बीच आईपीसी के लिए उपयोग करने की आवश्यकता है। मेरे पास ओवरलैप मोड को अनब्लॉक करने में पाइप का उपयोग कर सर्वर और क्लाइंट प्रक्रिया दोनों हैं।गैर-अवरुद्ध कनेक्टनामयुक्त पाइप ईवेंट संकेत नहीं मिला
सबकुछ ठीक काम करता है (सर्वर को क्लाइंट द्वारा भेजे गए स्ट्रिंग को सफलतापूर्वक प्राप्त होता है) सिवाय इसके कि ओवरराप्लेड संरचना के माध्यम से 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???
}
}
क्या यह ERROR_IO_PENDING प्राप्त करता है? (आप बेहतर ढंग से इस मामले को अलग करना चाहते हैं, या आपको प्रक्रिया से संलग्न होना है और यह देखना है कि यह कहां इंतजार कर रहा है) –