2011-01-02 6 views
8

मैंने माइक्रोसॉफ्ट के HTTP Server API पर बस ठोकर खाई है। परिचय कहता है:I/O प्राप्ति बंदरगाहों के साथ HttpApi का उपयोग

HTTP सर्वर एपीआई अनुप्रयोगों को माइक्रोसॉफ्ट इंटरनेट इनफॉर्मेशन सर्वर (आईआईएस) का उपयोग किए बिना HTTP पर संचार करने में सक्षम बनाता है। एप्लिकेशन विशेष यूआरएल के लिए HTTP अनुरोध प्राप्त करने के लिए पंजीकरण कर सकते हैं, HTTP अनुरोध प्राप्त कर सकते हैं, और HTTP प्रतिक्रिया भेज सकते हैं। HTTP सर्वर एपीआई में एसएसएल समर्थन शामिल है ताकि अनुप्रयोग आईआईएस के बिना सुरक्षित HTTP कनेक्शन पर डेटा का आदान-प्रदान कर सकें। यह आई/ओ पूरा करने वाले बंदरगाहों के साथ काम करने के लिए भी डिज़ाइन किया गया है।

यह ठंडा ढूंढना, मैंने एपीआई के दोनों संस्करणों के लिए कार्यों की सूची पर एक लंबा कठोर नजर डाला। अब, दस्तावेज का एकमात्र अन्य भाग जो I/O समापन बंदरगाहों का उल्लेख करता है वह HttpReceiveHttpRequest() फ़ंक्शन है। पिछले पैरामीटर निम्नलिखित विवरण के साथ एक वैकल्पिक OVERLAPPED संरचना होती है:

अतुल्यकालिक कॉल के लिए, एक OVERLAPPED संरचना को इंगित करने के pOverlapped सेट; तुल्यकालिक कॉल के लिए, इसे NULL पर सेट करें। निर्दिष्ट कतार में एक अनुरोध तक पहुंचने तक एक सिंक्रोनस कॉल ब्लॉक और कुछ या सभी को पुनर्प्राप्त कर लिया गया है, जबकि एक एसिंक्रोनस कॉल तुरंत ERROR_IO_PENDING देता है और कॉलिंग एप्लिकेशन तब GetOverlappedResult()या I/O पूर्णता बंदरगाहों का उपयोग करता है यह निर्धारित करने के लिए कि ऑपरेशन कब होता है पूरा कर लिया है। सिंक्रनाइज़ेशन के लिए ओवरलैप्ड संरचनाओं का उपयोग करने के बारे में अधिक जानकारी के लिए, Synchronization and Overlapped Input and Output देखें।

कोई अन्य जानकारी नहीं है, और सभी संरचनाएं अपारदर्शी हैं और जानबूझकर कनेक्शन जानकारी छिपाती हैं। यह भी ध्यान दें कि सिंक्रनाइज़ेशन और ओवरलैप इनपुट और आउटपुट विषय HTTP API का कोई उल्लेख नहीं करता है।

क्या किसी को भी HTTP एपीआई कतार को I/O समापन पोर्ट से कनेक्ट करने के बारे में कोई जानकारी है?

+0

क्या आपके पास यह विश्वास करने का कोई कारण है कि आप CreateIoCompletionPort के पहले पैरामीटर के रूप में कतार में हैंडल को पास नहीं करेंगे? – Gabe

+2

नहीं। मेरे पास विश्वास करने का कोई कारण नहीं है कि यह करने के लिए सही बात है। –

उत्तर

3

आईओ पूरा होने के बंदरगाहों का उपयोग सिद्धांत में तुच्छता सरल, लेकिन व्यवहार में abomnible है: पी

"सामान्य" उपयोग है:

  1. कॉल CreateIOCompletionPort एक आईओ पूरा होने के बंदरगाह संभाल बनाने के लिए।
  2. थ्रेड का एक समूह बनाएं, और प्रत्येक थ्रेड को लूप पर प्राप्त करें, GetOverlappedResult पर कॉल करें। GetOverlappedResult वापस आ जाएगा जब बंदरगाह से जुड़े एक ओवरलैप ऑपरेशन पूर्ण हो जाता है, संरचनाओं के साथ कौन सा हैंडल, और ऑपरेशन पूरा हो गया था।
  3. जैसे ही आपका प्रोग्राम चलता है, और ऑब्जेक्ट बनाता है जो यह असीमित रूप से संभालना चाहता है, यह प्रत्येक IANDLE को IO CompletionPort हैंडल के साथ CreateIOCompletionPort को दोबारा कॉल करके जोड़ता है।

अब, हर बार आवेदन हैंडल पर एक अतुल्यकालिक कार्रवाई पूर्ण संचालन की अधिसूचना GetOverlappedResult लौटने पर इंतजार कर thats धागे में से एक द्वारा दिखाया जाएगा (जो एक ओवरलैप struct में पास करके संकेत है) जारी करता है।

स्पष्ट निहितार्थ यह है कि HttpCreateRequestQueue द्वारा वापस किए गए हैंडल को आईओ प्रोजेक्शन पोर्ट से जोड़ा जा सकता है और बाद में एसिंक्रोनस ऑपरेशंस के परिणामस्वरूप GetOverlappedResult ऑपरेशन के परिणाम को वापस कर देगा।

+0

हां, मेरे पास मौजूदा I/O पूर्णता पोर्ट आधारित सर्वर है। हालांकि, मैं इस विचार को बिल्कुल साझा नहीं करता हूं कि निहितार्थ "स्पष्ट" है। मैं यह देखने के लिए कोशिश करूंगा कि यह कैसे जाता है। –

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