2009-02-10 8 views
5

मुझे यह निर्धारित करने की ज़रूरत है कि मेरा कोड नहीं बनाया गया है, जिसके लिए GetFileType()==FILE_TYPE_PIPE, सॉकेट है या नहीं। इसके लिए एक एपीआई प्रतीत नहीं होता है।अन्य पाइप हैंडल से Win32 सॉकेट हैंडल को कैसे अलग किया जाए?

मैंने निम्नलिखित कोशिश की है। सामान्य विचार सॉकेट-विशिष्ट फ़ंक्शन का उपयोग करना और गैर-सॉकेट के रूप में विफलता का इलाज करना है।

  • getsockopt() - यह मेरा पहला प्रयास था। दुर्भाग्य से ऐसा लगता है कि एक ही (गैर-सॉकेट) हैंडल पर कई धागे द्वारा बुलाया जाता है।
  • WSAEnumNetworkEvents() - यह ग्नुलिब करता है लेकिन अगर संभाल एक सॉकेट है तो अवांछनीय दुष्प्रभाव होंगे।
  • getpeername() - यह साइगविन करता है लेकिन यह कुछ सॉकेट के लिए भी असफल हो जाएगा। यह अनुमान लगाते हुए कि कोई त्रुटि सॉकेट-नेस का तात्पर्य है, विश्वसनीय और भविष्य सुरक्षित नहीं है।

मुझे कोई फर्क नहीं पड़ता कि समाधान केवल विंडोज के कुछ संस्करणों पर काम करता है, उदाहरण के लिए विस्टा, मैं सामान्य मामले में हमेशा किसी अन्य विधि पर वापस आ सकता हूं।

उत्तर

1

क्या आपने WSADuplicateSocket को आजमाया है। तो बस WSAPROTOCOL_INFO जांचें कि क्या इसका नामित पाइप वास्तव में देखने के लिए ...

+0

नहीं। मैं इसे आज़माउंगा, धन्यवाद। –

2

मैं सोच रहा हूँ कि शायद आप अपने हैंडल पर GetNamedPipeInfo() कॉल करने का प्रयास कर सकता है। यदि कॉल सफल होता है तो आप जानते हैं कि हैंडल एक पाइप हैंडल है, अन्यथा यह एक सॉकेट होना चाहिए।

+0

धन्यवाद। यह सॉकेट-विशिष्ट कार्यों (जो गैर-सॉकेट के लिए लटकने के लिए जाना जाता है) का उपयोग करने से सुरक्षित हो सकता है। –

0

आप GetLamedPipeHandleState() का भी उपयोग कर सकते हैं, GetLastError() के साथ परिणाम का मूल्यांकन कर सकते हैं।

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