2012-04-08 18 views
6

मैं एक प्रोग्राम बना रहा हूं जो सभी ट्रैफिक पढ़ने के लिए रॉ सॉकेट बनाता है। सॉकेट() और recvfrom() के कॉल के बीच (आखिरी एक बफर से सभी पैकेट निकालने के लिए एक लूप में है) मैं 5s इंतजार करता हूं।SO_RCVBUF का मूल्य क्यों बदलता नहीं है?

जब मैं प्रोग्राम चलाता हूं, तो मैं अपने प्रोग्राम में «तेज मोड» (तेजी से बफर भरने के लिए) में hping3 कमांड के साथ लगभग 200 पैकेट भेजता हूं। जैसे ही 5s समाप्त हो जाते हैं, मेरा प्रोग्राम बफर से लगभग 150 पैकेट निकालता है।

मैं प्राप्त बफर के आकार बदलने के लिए बेहतर परिणाम प्राप्त करने की कोशिश:

int a = 65535; 
if ((setsockopt(sockfd, 0, SO_RCVBUF, &a ,sizeof(int))) < 0) 
{ 
    fprintf(stderr, "Error setting sock opts..\n"); 
} 

हालांकि, जो कुछ «एक», 1 या 10000000 का मूल्य है, यह कुछ भी बदल जाता है, मैं अभी भी लगता है ~ बफर से 150 पैकेट।

समस्या क्या है?

संपादित करें: «ए» का मान getsockopt कॉल के साथ सत्यापित किया गया है।

+0

क्या आप हमें अधिक सॉकेट दिखा सकते हैं, जिसमें 'सॉकेट() 'आदि के लिए प्रासंगिक कॉल शामिल हैं? हमें बताएं कि आपके ऑपरेटिंग सिस्टम भी मदद कर सकते हैं। –

+0

निश्चित रूप से, मैं इस प्रोग्राम को लिनक्स 3.2 64 बिट्स के तहत चलाता हूं। 'सॉकेट() ':' sockfd = सॉकेट (AF_INET, SOCK_RAW, IPPROTO_TCP)' – Flow

उत्तर

7

setsockopt को level तर्क SOL_SOCKET, नहीं 0 होना चाहिए:

int a = 65535; 
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &a, sizeof(int)) == -1) { 
    fprintf(stderr, "Error setting socket opts: %s\n", strerror(errno)); 
} 
+0

पर कॉल, धन्यवाद, यह अब मूल्य परिवर्तनों को अच्छी तरह से काम करता है। हालांकि बफर प्राप्त करने की सीमा 262142 है और यदि एक पैकेट 50 बाइट आकार का है तो स्मृति में लगभग 5200 पैकेट और केवल 150 नहीं होना चाहिए? – Flow

+0

(हल, नीचे देखें) – Flow

13

तुम भी ओएस द्वारा सीमित किया जा सकता है, अगर यह अभी भी काम कर रहे हैं नहीं लगता है। में मूल्यों की जाँच करें:

/proc/sys/net/core/rmem_default 
/proc/sys/net/core/rmem_max 

यदि यह टीसीपी के रूप में आप अपने उदाहरण में कहते हैं, और नहीं वास्तव में एक रॉ सॉकेट, आप भी मूल्यों में देख सकते हैं:

/proc/sys/net/ipv4/tcp_mem 

आप इन पर बिल्ली चलाते हैं फाइलें वे आपको वर्तमान सेटिंग्स दिखाएंगे। उन्हें स्थायी रूप से बदलने के लिए, sysctl का उपयोग करें। चीजों को बदलने शुरू करने से पहले इन सेटिंग्स को लिखना एक अच्छा विचार है। उन परिवर्तनों को करने के लिए यहां एक शानदार ट्यूटोरियल है: http://fasterdata.es.net/fasterdata/host-tuning/linux/

+0

भी धन्यवाद, मैंने rmem_max मान बढ़ाया है और यह बहुत अच्छी तरह से काम करता है मैं सभी पैकेट प्राप्त कर सकता हूं। – Flow

+0

आपको विंडोज़ के बारे में कोई जानकारी है, जहां हम यह मान देख सकते हैं? – sreepurna

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