2012-10-22 18 views
5

में एक सॉकेट है जहां मैं एक सॉकेट सुनना चाहता हूं और क्लाइंट कनेक्ट करने की प्रतीक्षा करना चाहता हूं और उसके बाद कनेक्शन को स्थापित करने के बाद कनेक्शन शुरू कर दूंगा।अन्य पोर्ट

मेरे पास इस अन्य एप्लिकेशन पर नियंत्रण नहीं है और केवल वह पोर्ट सेट कर सकता है जहां यह सुनेंगे, लेकिन मैं प्रत्येक नए क्लाइंट के लिए एक प्रक्रिया चाहता हूं।

routing

मैं एक समाधान के लिए खोज कर रहा है, लेकिन मैं बात मैं सही शब्दावली नहीं है, लेकिन मैं पर खोज करने में कामयाब:

यह मुझे क्या करना कोशिश कर रहा हूँ है रिचर्ड स्टीवंस 'यूनिक्स नेटवर्क प्रोग्रामिंग' AF_ROUTE सॉकेट के परिवार के बारे में कुछ है जिसे SOCK_RAW के साथ जोड़ा जा सकता है ताकि किसी अन्य आईपी और पोर्ट से कनेक्शन हो सके। लेकिन how to use this flag के बारे में बहुत कम दस्तावेज है और ऐसा लगता है कि सुपरसुर विशेषाधिकारों (जिन्हें मैं टालना चाहता हूं) की आवश्यकता होती है।

शायद एक आसान समाधान है लेकिन मैं शायद गलत शब्दों का उपयोग कर रहा हूं। क्या यह स्पष्ट है कि मैं क्या करना चाहता हूं?

+0

ऐप्स और बंदरगाह 1: 1 मैपिंग हैं? यदि हां, तो वे खुद को क्यों नहीं सुन सकते? – SparKot

+0

@SparKot बिल्कुल नहीं। प्रत्येक नए ग्राहक के लिए, एक नया "एपीपी" खोला जाना चाहिए – JBernardo

+0

क्या आप अन्य एप्लिकेशन को किसी अन्य फ़ाइल डिस्क्रिप्टर (उदा। Stdin) से पढ़ने के लिए मना सकते हैं? यदि ऐसा है, तो आप stdin और फोर्क + पर सॉकेट एफडी को सिर्फ 'dup2' अन्य एप्लिकेशन को निष्पादित कर सकते हैं। –

उत्तर

0

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

हालांकि, क्या आपने बस पास-थ्रू के रूप में राउटर का उपयोग करने पर विचार किया है? असल में, क्या आपकी "राउटर" प्रक्रिया सॉकेट के माध्यम से प्रत्येक "एपीपी" प्रक्रिया में जुड़ती है, और जो उचित क्लाइंट से उपयुक्त एपीपी तक पहुंच जाती है, और एपीपी के लिए वीज़ा के विपरीत वीजा बनाते हैं?

यह ओवरहेड जोड़ता है, और आपको यह ट्रैक रखने के लिए एक छोटा मैपिंग प्रबंधित करना होगा कि कौन से क्लाइंट किन ऐप्स पर जाते हैं, लेकिन यह काम कर सकता है (माना जाता है कि एपीपी या क्लाइंट आईपी पते से कोई व्यवहार नहीं कर रहे हैं वे, आदि से जुड़े हुए हैं)। मान लीजिए कि आप एपीपी को पुन: संकलित नहीं कर सकते हैं, हो सकता है कि कई अन्य विकल्प न हों।

इसके लिए कोड अपेक्षाकृत सरल है। एपीपी से प्राप्त आंकड़ों के लिए आपका हैंडलर सिर्फ आपके मैपिंग से उपयुक्त ऐप के लिए सॉकेट देखता है, और फिर इस डेटा को इस पर नॉन अवरुद्ध भेज देता है। इसी प्रकार ग्राहक से प्राप्त डेटा के लिए हैंडलर। क्लाइंट और ऐप वास्तव में कैसा व्यवहार करते हैं, इस पर निर्भर करते हुए, आपको थोड़ा सिंक्रनाइज़ेशन (यदि आप दोनों एक साथ मिलते हैं) को संभालना पड़ सकता है।

+0

काम करेगा मैं वास्तव में दोनों सिरों को संवाद करने के लिए सॉकेट पर पढ़ना और लिखना नहीं चाहता था। शायद यह किया जा सकता है कि "एपीपी" इस फाइल डिस्क्रिप्टर से पढ़ा गया है। – JBernardo

+0

एचआरएम, शायद आपको यह स्पष्ट करने के लिए प्रश्न संपादित करना चाहिए कि एपीपी क्या कर सकता है और नहीं कर सकता है? जिस तरह से मैंने पढ़ा "मेरे पास इस अन्य एप्लिकेशन पर नियंत्रण नहीं है और केवल वह बंदरगाह सेट कर सकता है जहां यह सुनेगा" मुझे यह समझाने के लिए कि उसे सॉकेट को पढ़ना पड़ा और अन्य विकल्प नहीं थे।अगर एपीपी में अन्य आई/ओ विकल्प हैं जैसे कि stdin/out या शायद कुछ अन्य कमांड लाइन पैरामीटर जो आप इसके साथ खेल सकते हैं, उत्तरदाताओं को सुझावों के साथ आने में मदद मिल सकती है :) – davec

+0

मुझे नहीं लगता था कि मैं ऐसा कर सकता हूं, लेकिन एडम रोसेनफील्ड की टिप्पणी ऊपर की जा सकती है एक विकल्प बनें मैं अब कोशिश कर रहा हूं, लेकिन मुझे नहीं पता कि यह या तो काम करेगा या नहीं – JBernardo