2012-05-17 8 views
5

संभव डुप्लिकेट:
How do you throttle the bandwidth of a socket connection in C?मैं सी में सॉकेट गति को कैसे सीमित करूं?

मैं एक यूनिक्स पर्यावरण के लिए सी में एक सरल FTP सर्वर लिख रहा हूँ। सर्वर की सुविधा के रूप में, मैं किसी उपयोगकर्ता की अपलोड/डाउनलोड गति को सीमित करना चाहता हूं।

  1. क्या कोई पुस्तकालय कार्य सीधे इस समस्या को हल करता है?

  2. यदि नहीं, तो उत्पादन एफ़टीपी सर्वर में उपयोग किए गए एल्गोरिदम क्या है? मेरे पास एक बहुत ही निष्क्रिय समाधान है: गणना करें कि कितने बाइट्स एक दूसरे में भेजने के लिए कहते हैं, x, write(x) या read(x), और फिर sleep(1) कहें।

एक बेहतर समाधान होना चाहिए। कोड नमूने होने पर भी बेहतर होगा।

स्पष्ट होने के लिए, मैं मैक ओएस एक्स का उपयोग कर रहा हूं, लेकिन मेरी इच्छा है कि यह उबंटू या कुछ लिनक्स के तहत भी चलाया जा सके।

+0

* "सर्वर की एक विशेषता के रूप में, मैं एक उपयोगकर्ता के अपलोड/डाउनलोड की गति को सीमित करना चाहते हैं" * - यही कारण है कि एक भयानक सुविधा –

+0

की तरह लगता है आप किस ओएस पर हैं? – jman

+1

यह प्रश्न मदद कर सकता है - http://stackoverflow.com/questions/235762/how-do-you-throttle-the-bandwidth-of-a-socket-connection-in-c –

उत्तर

0

क्या आप वाकई ऐसा करना चाहते हैं? क्या आपके उपयोगकर्ताओं को परेशान करने का आपका मकसद है? (यह एक वैध उद्देश्य है - कई "मुफ्त अपलोड" साइटों में से कोई भी देखें)

बैंडविड्थ इस तरह सीमित है, यह आपके सर्वर को ओवरलोड से बचाने का एक अच्छा तरीका नहीं है। लोगों को थ्रेडेड क्लाइंट मिलेगा और समवर्ती एफ़टीपी सत्र खुलेगा ...

क्या ऐसा करने के लिए कोई पुस्तकालय कार्य है?

शायद नहीं, बैंडविड्थ आकार एक ओएस कार्य है जो सेवा कार्य नहीं है।

एल्गोरिदम क्या है?

जो आप वर्णन करते हैं वह काफी प्रभावी लगता है।

इसे बेहतर बनाने के लिए यह देख सकता है कि कितने ऑक्टेट्स पढ़े गए हैं या लिखे गए हैं और सोने का फैसला करने से पहले कितना समय व्यतीत किया गया है। उस मामले पर विचार करें जहां ग्राहक आपकी सीमा से धीमा है: पढ़ और लिखना अवरुद्ध हो जाएगा और आपकी नींद() केवल अनावश्यक विलंबता को जोड़ देगा। इससे उपयोगकर्ता से डिस्क विलंबता आदि के छिपे प्रभाव भी कम हो जाएंगे।

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

0

एफ़टीपी एक एप्लिकेशन लेयर प्रोटोकॉल है। एफ़टीपी टीसीपी या यूडीपी सॉकेट पर चल सकता है। (संपादित करें: TFTP और यूडीपी पर uftp रन, कृपया जानकारी के लिए टिप्पणी अनुभाग देखें)

सॉकेट स्पीड निम्न में से एक समारोह है:

  1. लिंक गति: 10/100 बेस टी और इतने पर।
  2. लिंक का बीईआर: बिट त्रुटि दर (आमतौर पर आज की दुनिया में आमतौर पर पावर -9 या उस तरह की कुछ चीज़ों के लिए कम 10 होती है। इसमें भी त्रुटियां होती हैं।
  3. सॉकेट बफर आकार: /proc/sys/net/core मापदंडों

linux पर: टीसीपी सॉकेट से निपटने के लिए यहां एक अच्छा लेख है [1]

4.Tweak ढेर फिल्टर करने के लिए/ड्रॉप पैकेट पैकेट क्षति लागू करने के लिए, इस प्रकार अंततः प्रवाह दर को थ्रॉटलिंग: नेटम [2] जैसे टूल्स आपको फ्लो को थ्रॉटल करने के लिए बाल्टी समायोजित करने में मदद करते हैं।

[1] http://www.cyberciti.biz/faq/linux-tcp-tuning/

[2] http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

+2

"एफ़टीपी यूडीपी सॉकेट पर चल सकता है" ... इस दावे के सबूत की आवश्यकता है। –

+1

एफ़टीपी से digression से चर्चा से बचने के लिए मैंने वहां विवरण प्रदान नहीं किया। 1. गति के लिए udp पोर्ट 69 पर tftp रन। 2. uftp है जो एक बहु कास्ट फ़ाइल स्थानांतरण है जो सुरक्षा के लिए एन्क्रिप्शन प्रदान करता है। –

+1

टीएफटीपी फाइलों को स्थानांतरित करता है, लेकिन यह एफ़टीपी नहीं है। Ditto uftp। –

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