2011-01-05 27 views
6

से सॉकेट हैंडल पास करें मेरे पास वर्तमान में एक .NET प्रोग्राम है जो किसी सर्वर से कनेक्शन शुरू करता है और दूसरा, अप्रबंधित निष्पादन योग्य प्रारंभ करता है। मूल प्रक्रिया को एक ही सॉकेट पर लेना चाहिए (कनेक्शन के लिए यह आवश्यक है कि बच्चे की प्रक्रिया समाप्त होने तक बंद न हो!) और सर्वर के माध्यम से इसके माध्यम से संचार करना शुरू करें।.NET से अप्रबंधित बाल प्रक्रिया

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

अग्रिम धन्यवाद!

+1

यहां नमूना देखें [सॉकेट डुप्लिकेशन - भाग 2] (http://blogs.msdn.com/b/malarch/archive/2005/12/26/507461.aspx) – lsalamon

उत्तर

4

.NET 2.0 और बाद में आसान विधि DuplicateAndClose प्रदान करता है।

अद्यतन: सॉकेट इंफॉर्मेशन में कहां (ऑफसेट पर) पता लगाने के लिए हैक की तरह दिखने की आवश्यकता होगी। प्रोटोकॉल सूचना गंतव्य सॉकेट संग्रहीत की जाती है। यह स्रोत प्रक्रिया में बाइट सरणी को कैप्चर करके किया जा सकता है, फिर किसी अन्य .NET प्रक्रिया में सॉकेट को फिर से बनाना और सॉकेट हैंडल प्राप्त करना (उस दूसरी प्रक्रिया में)। फिर देखें कि डेटा बाइट सरणी में कहां है।

सॉकेट, described here डुप्लिकेट करने के लिए भी एक अच्छा अप्रबंधित तरीका है।

+0

मेवेस्की 'एल्डोएस: एमएसडीएन कहते हैं:' लक्ष्य प्रक्रिया को डुप्लिकेट सॉकेट इंस्टेंस बनाने के लिए सॉकेट का उपयोग करना चाहिए। 'एक अप्रबंधित प्रक्रिया के लिए यह संभव नहीं है। –

+0

@sad_man आप सही हैं। एक और विकल्प है जिसे मैंने अपडेट में शामिल किया है। –

+0

मुझे डुप्लिकेट और क्लोज़ करने के लिए इंगित करने के लिए धन्यवाद। मैंने P/Invoke कॉलिंग WSADuplicateSocket का उपयोग करके कुछ बहुत गंदे कोड लिखने को समाप्त कर दिया है, लेकिन ऐसा लगता है कि यह चाल करेगा, अब के लिए :) – em70

0

मुझे लगता है कि .NET सॉकेट क्लास द्वारा बनाए गए सॉकेट हैंडल डिफ़ॉल्ट रूप से विरासत में हैं। आईआईआरसी यदि आप Process.Start और ProcessStartInfo.UseShellExecute = false (ShellExecute हैंडल विरासत की अनुमति नहीं देते हैं) का उपयोग कर बच्चे की प्रक्रिया को जन्म देते हैं, तो आपके बच्चे की प्रक्रिया को पहले ही सॉकेट हैंडल का उत्तराधिकारी होना चाहिए। क्या आपने बस सॉकेट को पार करने का प्रयास किया था। बच्चे की प्रक्रिया में घूमना और वहां इसका उपयोग करना? और मैं सोचता हूं कि जब तक कि बच्चे की प्रक्रिया विरासत वाले हैंडल का मालिक हो, तब तक सॉकेट खुला रहता है, जिस प्रक्रिया के बाद यह समाप्त हो जाता है। (मैंने कभी इसका इस्तेमाल कभी नहीं किया, लेकिन मेरे पास एक बार एक औसत बग था जो इस व्यवहार से हुई थी।) हालांकि, सॉकेट FILE_FLAG_OVERLAPPED इत्यादि जैसे झंडे के साथ खोला गया हो सकता है और आपको इसे एक्सेस करने के कार्यों के सही संयोजन का उपयोग करना होगा।

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