2012-10-15 30 views
8

मैंने लिनक्स में दो जोड़ी कोड (server.c और client.c) लिखा है। इंटरनेट-डोमेन AF_INET के लिए यूनिक्स-डोमेन AF_UNIX अन्य के लिए एक। दोनों ठीक काम कर रहे हैं!सी में सॉकेट प्रोग्रामिंग में कतार लंबाई() क्यू लंबाई?

listen() बैकलॉग कतार की लंबाई के लिए बुलाया = 3both servers

listen(sockfd, 3); 

यूनिक्स डोमेन में (AF_UNIX) में किया जाता है: एक ग्राहक सर्वर के साथ जुड़ा हुआ है है, अगर मैं सर्वर से अधिक ग्राहकों कनेक्ट करने का प्रयास । तीन कतार में रखा जाता है, और चौथे अनुरोध का अस्वीकार कर दिया जाता है। (जैसा कि मैंने वांछित - 3 प्रतीक्षा कतार में)।

इंटरनेट डोमेन (AF_INET) में: लंबित कतार में तीन से अधिक का अनुरोध रखा जाता है।

चौथे ग्राहक से अनुरोध क्यों अस्वीकार नहीं किया गया है, भले ही बैकलॉग कतार की लंबाई तीन हो? और listen() (और अन्य) प्रोटोकॉल का व्यवहार क्यों निर्भर है?

+0

मैं वास्तव में आपके इरादे को समझ नहीं पा रहा हूं ... कतार पूर्ण होने के कारण आप कभी क्लाइंट को क्यों अस्वीकार करना चाहेंगे? –

+1

@ करोलि हॉर्वथ: मेरा मतलब है कि अगर मुझे प्रतीक्षा कतार की लंबाई दी गई तो इसे खारिज कर दिया जाना चाहिए। और मैं इसके बारे में जानना चाहता हूं। –

+0

@ गृजेश चौहान: सैद्धांतिक रूप से ... हाँ .. * व्यावहारिक रूप से * .. कौन परवाह करता है? यह आपको परेशान क्यों करता है? –

उत्तर

9

ऑपरेटिंग सिस्टम वास्तव में listen() पर निर्दिष्ट एक से आने वाले टीसीपी कनेक्शन के लिए बड़ी कतार का उपयोग करते हैं। ऑपरेटिंग सिस्टम पर कितना बड़ा निर्भर करता है।

listen(int socket_fd, int backlog) 

किसी दिए गए सुनने के लिए सॉकेट कर्नल दो कतार बनाए रखता है।

  1. एक अपूर्ण कनेक्शन कतार - जिसके लिए SYN आ गया है लेकिन तीन-तरफा हैंडशेकिंग (टीसीपी) पूरी तरह से नहीं किया जाता है। (SYN_RCV स्थिति)
  2. एक पूर्ण कनेक्शन कतार - तीन-तरफा हैंडशेकिंग किया गया। (स्थापित राज्य)

बैकलॉग तर्क ऐतिहासिक दृष्टि से दोनों कतारों की राशि निर्दिष्ट करें। लेकिन बैकलॉग का अर्थ औपचारिक परिभाषा नहीं है।

बर्कले-व्युत्पन्न कार्यान्वयन बैकलॉग में एक झुकाव कारक जोड़ता है। तो कुल कतार length = factor * backlog

डब्ल्यू रिचर्ड स्टीवंस द्वारा एक पुस्तक में दी गई एक बहुत विस्तृत और गहरी व्याख्या। इसके अलावा सात ऑपरेटिंग सिस्टम के लिए मूल्य दिखाने वाली एक तालिका स्टीवंस, फेनर, रुडॉफ़, "Unix Network Programming: The Sockets Network API", वॉल्यूम 1, थर्ड संस्करण, पृष्ठ 108.

+1

उदाहरण के लिए लिनक्स 2.4 पर।7 'सुनें') को दिए गए 3 का 'बैकलॉग' कतारबद्ध 6 कनेक्शन तक परिणाम। –

+1

आपके उत्तर में कुछ और विवरण संपादित किया गया। धन्यवाद! –

+0

CentOS 6.6 2.6.32-504.el6.x86_64 बैकलॉग कतार बैकलॉग पैरामीटर +1 है – adrianlzt

3

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