2012-06-27 22 views
15

के साथ नेटवर्क स्थितियों को अनुकरण करें मैं सॉकेट में नेटवर्क अनुकरण जोड़ने का एक तरीका ढूंढ रहा हूं।सी/सी ++ सॉकेट

मूल समाधान बैंडविड्थ सीमा को कनेक्शन में जोड़ने का कोई तरीका होगा।

मेरे लिए आदर्श समाधान होगा:

  • समर्थन उन्नत नेटवर्क संपत्तियों (विलंबता, पैकेट हानि)
  • ओपन-सोर्स
  • मानक सॉकेट (या उनके आसपास wraps) के रूप में एक ऐसी ही एपीआई है दोनों विंडोज और लिनक्स
  • समर्थन IPv4 और IPv6
पर
  • कार्य

    मैंने कुछ विकल्प देखा जो सिस्टम स्तर पर काम करते हैं, या यहां तक ​​कि प्रॉक्सी (डमीनेट, वैनेम, नेटन इत्यादि) के रूप में भी काम करते हैं, लेकिन यह मेरे लिए काम नहीं करेगा, क्योंकि मैं प्रत्येक सॉकेट मैन्युअल रूप से अनुकरण करने में सक्षम होना चाहता हूं (उदाहरण के लिए, मॉडेम इम्यूलेशन के साथ एक सॉकेट खोलें और एक 3 जी अनुकरण के साथ। असल में मैं जानना चाहता हूं कि ये उपकरण कैसे करते हैं।

    संपादित करें: मुझे इस कार्यक्षमता को अपने उत्पाद में एम्बेड करने की आवश्यकता है, इसलिए मैन्युअल कॉन्फ़िगरेशन की आवश्यकता वाले अतिरिक्त बॉक्स या तृतीय-पक्ष टूल का उपयोग करना स्वीकार्य नहीं है। मैं कोड लिखना चाहता हूं जो वही काम करता है जैसे कि उपकरण करते हैं, और मेरा सवाल यह है कि यह कैसे करें।

    एपिलोग: हिंडसाइट में, मेरा प्रश्न थोड़ा भ्रामक था। जाहिर है, मैं जो सॉकेट पर सीधे चाहता था उसे करने का कोई तरीका नहीं है। वहाँ दो विकल्प हैं:

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

    एक प्रॉक्सी (@ m0she और दूसरों का जवाब के आधार पर) के रूप में नेटवर्क अनुकरण तर्क जोड़ें:
    या तो प्रॉक्सी के माध्यम से अनुरोध भेज सकते हैं या अनुरोधों को रोक करने के लिए प्रॉक्सी का उपयोग करें, फिर वांछित सिमुलेशन जोड़ें। हालांकि, यह आपके स्वयं के प्रॉक्सी कार्यान्वयन को लिखने के बजाय एक तैयार समाधान का उपयोग करने के लिए और अधिक समझ में आता है - मैंने जो देखा है उससे शायद सबसे अच्छा विकल्प है (यह वही है webpagetest.org करता है)। अन्य विकल्प नीचे दिए गए उत्तरों में हैं, मैं भी DonsProxy
    यह भी करने का बेहतर तरीका है, इसलिए मैं इस उत्तर को स्वीकार कर रहा हूं।

  • +3

    सी ++ में सॉकेट नहीं हैं। –

    +1

    यह एक सी ++ अनुप्रयोग है कि आप ठीक कह रहे हैं - सॉकेट सी (विनसॉक और POSIX) –

    +1

    सी सॉकेट नहीं है या तो ... ओएस-प्रदान की पुस्तकालयों (सी इंटरफेस के साथ) है। Pedantic नहीं होने के लिए ... :) –

    उत्तर

    6

    आप अपने सॉफ़्टवेयर में प्रॉक्सी संकलित कर सकते हैं जो ऐसा करेगा। यह पूर्ण रूप से मोजे प्रॉक्सी (this) के कुछ कार्यान्वयन हो सकता है या शायद बेहतर, कुछ आसान है जो केवल आपके उद्देश्य को पूरा करेगा (और गंतव्य और अन्य मोजे के ऊपर अपने संचार को उपसर्ग करने की आवश्यकता नहीं है)। वह कोड आपकी प्रक्रिया के भीतर एक अलग प्रक्रिया या धागे के रूप में चलाया जा सकता है।

    प्रॉक्सी में थ्रॉटलिंग जोड़ना बहुत मुश्किल नहीं होना चाहिए। आप कर सकते हैं:

    • देरी डेटा के अग्रेषण अगर यह पहले बफ़र्स पर पढ़ने/लिखने के संचालन टाइमर जोड़कर कुछ बैंडविड्थ सीमा
    • ऐड विलंबता गुजरता है।
    • यदि आप कनेक्शन आधारित प्रोटोकॉल (जैसे टीसीपी) के साथ काम कर रहे हैं, तो पैकेट ड्रॉप करना बेकार होगा, लेकिन डेटाग्राम आधारित प्रोटोकॉल (यूडीपी) के साथ यह लागू करना भी आसान होगा।

    कनेक्शन निर्माण एपीआई सामान्य POSIX/विनसॉक से थोड़ा अलग होगा (जब तक आप कुछ मैक्रो या अन्य जादू करते हैं), लेकिन बाकी सब (भेजें/recv/select/पास/आदि ..) एक ही है ।

    +0

    यह एक दिलचस्प विचार है, हालांकि अगर मुझे देरी के लिए कोड लिखने की ज़रूरत है, तो मैं इसे सीधे उस कोड में लिख सकता हूं जो डेटा भेजता/प्राप्त करता है, मुझे इसके लिए प्रॉक्सी की आवश्यकता नहीं है (देखें @ पॉल कोकोली का जवाब) –

    +0

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

    +0

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

    2

    मै मैक ओएस एक्स शेर के लिए केवल नेटवर्क लिंक कंडीशनर जानता हूं। आपको इसे डाउनलोड करने के लिए मैक डेवलपर होना चाहिए, इसलिए मैं वहां डाउनलोड लिंक नहीं डाल सकता। 9to5mac.com से केवल विवरण: http://9to5mac.com/2011/08/10/new-in-os-x-lion-network-link-conditioner-utility-lets-you-simulate-internet-and-bandwidth-conditions/

    +0

    धन्यवाद के साथ क्लाइंट से निपटने के लिए धन्यवाद, लेकिन मैं नहीं हूं खोज रहे हैं - यह सिस्टम स्तर पर है, मैं निचले स्तर (सॉकेट) की तलाश में हूं। इसके अलावा, बहु-प्लेटफॉर्म द्वारा, मुझे वास्तव में विंडोज और लिनक्स का मतलब था, लेकिन मैक –

    1

    आप आमतौर पर बैंड नेटवर्क द्वारा बैंडविड्थ या विलंबता को थ्रॉटल करते हैं, पोर्ट बंदरगाह के आधार पर बंदरगाह पर, आप तब प्राप्त कर सकते हैं जो आप आवंटित बंदरगाह से कनेक्ट करके प्राप्त कर सकते हैं विशेष प्रकार का क्रैपी नेटवर्क जिसे आप परीक्षण करना चाहते हैं, जिसमें कोई कोड परिवर्तन या संशोधन आवश्यक नहीं है।

    यह करने के लिए सबसे आसान तरीकों में सिर्फ add iptables rules एक Linux सर्वर एक प्रॉक्सी के रूप में कार्य करने के लिए है।

    आप इसे अलग डिवाइस के बिना काम करना चाहते हैं, मिलने एक सॉफ्टवेयर पैकेज है कि आपके ग्राहक पीसी पर अपने नेटवर्क throttles है कि कोशिश करते हैं। (या for Windows)

    +0

    नहीं, मैं चाहता हूं कि यह सुविधा मेरे उत्पाद का हिस्सा बनें, और इसलिए मैं किसी अन्य उत्पाद को इंस्टॉल/कॉन्फ़िगर नहीं कर सकता। असल में, मैं जानना चाहता हूं, ये लोग कैसे करते हैं? –

    2

    लिनक्स का उपयोग करते समय यह उत्तर आपके लिए आंशिक समाधान हो सकता है: Simulate delayed and dropped packets on Linux। यह netem नामक एक कर्नेल मॉड्यूल को संदर्भित करता है, जो सभी प्रकार की नेटवर्क समस्याओं का अनुकरण कर सकता है।

    आप, TCP कनेक्शन के साथ काम करने के लिए "पैकेट क्षति" समस्याग्रस्त के बाद का एक बहुत (खो संकुल उबरने की तरह) त्रुटि हैंडलिंग हो सकता है चाहते हैं कर्नेल में किया जाता है। इसे क्रॉस-प्लेटफ़ॉर्म तरीके से सिम्युलेट करना मुश्किल हो सकता है।

    +0

    पैकेट नुकसान मेरे लिए नहीं होना चाहिए, लेकिन इसे प्रोग्रामेटिकल करना है - मैं नेटम स्थापित या सेटअप नहीं कर सकता। –

    1

    आप WANem http://wanem.sourceforge.net/ जांच करना चाहते हैं कर सकते हैं। WANEM ओपन सोर्स है और जीएनयू जनरल पब्लिक लाइसेंस के तहत लाइसेंस प्राप्त है।

    WANem सेटअप एक पारदर्शी आवेदन प्रवेश द्वार नेटवर्क देरी, पैकेट हानि, पैकेट भ्रष्टाचार, डिस्कनेक्शन, पैकेट फिर से आदेश देने, जिटर, आदि

    +0

    मैंने वैनेम को देखा (मैंने इसे अपने प्रश्न में भी उल्लेख किया है), लेकिन यह नहीं है कि मैं –

    6

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

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

    पृष्ठभूमि धागा भी कनेक्शन के दूसरी ओर अनुकरण करने के लिए है यह लग रहा है, हालांकि आप पहले से ही उस भाग को लागू किया है हो सकता है चाहते हैं?

    +0

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

    1

    यदि आप एक सॉफ्टवेयर केवल समाधान चाहते हैं जिसे आप नियंत्रित करते हैं, तो आपको इसे स्वयं लागू करना होगा। मुझे ऐसा कोई मौजूदा पैकेज नहीं पता है।

    एक सॉकेट पर एक आवरण परत आप देरी शुरू करने की क्षमता दे सकता है, यह नुकसान या वितरण व्यवस्था से बाहर शुरू करने के लिए पर्याप्त नहीं होगा। उन गतिविधियों को अनुकरण करने के लिए, आपको वास्तव में दो टीसीपी ढेर के बीच पारगमन में डेटा को अवरुद्ध करने की आवश्यकता है।

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

    हालांकि, अगर आप क्लाइंट सॉफ्टवेयर परीक्षण कर रहे हैं के बाद से, मैं क्यों आप अपने जारी किया सॉफ्टवेयर में इस कोड को एम्बेड करने के लिए, जब तक कि सॉफ्टवेयर अपने आप में एक वैन का अनुकरण ग्राहक है चाहेगा के रूप में स्पष्ट नहीं कर रहा हूँ।

    1

    मैं तुम्हें Network Simulator जैसे किसी उपकरण का इस्तेमाल कर सकते हैं लगता है। विंडोज़ के लिए यह मुफ़्त है।

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

    +0

    धन्यवाद, लेकिन यह मेरे लिए काम नहीं करेगा। उनके अक्सर पूछे जाने वाले प्रश्नों के अनुसार - "इस समय आप प्रत्येक नेटवर्क इंटरफेस कार्ड के प्रति 32 प्रवाह तक बना सकते हैं। प्रवाह केवल सक्रिय होते हैं जब नेटवर्क सिम्युलेटर का जीयूआई घटक चल रहा है।" मुझे उससे अधिक प्रवाह की आवश्यकता है, और इसे प्रोग्रामेटिक रूप से सेट करने की आवश्यकता है (यूआई के माध्यम से नहीं), इसे भी लिनक्स के लिए भी चाहिए। –

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