2011-01-25 14 views
5

मुझे आईजीएमपी सॉकेट कॉल के साथ निम्नलिखित परिदृश्य से एक त्रुटि है;सॉकेट त्रुटि: 9 0: संदेश बहुत लंबा

fd = socket(PF_INET, SOCK_RAW, IPPROTO_IGMP) ; 
setsockopt(fd, IPPROTO_IP, IP_HDRINCL, nval, sizeof(nval)); 
/** Fill in the IP header and Ethernet header**/ 
/*** Fill, create the IGMP packet structures***/ 
if(sendto(fd, &buf, sizeof(buf), 0,(struct sockaddr *) &addr, sizeof(addr)) < 0) { 
    printf("Socket Sendto error %d : %s\n", errno, strerror(errno)); 
    return 0; 
} 

प्रेषण कॉल संदेश को बहुत लंबा कहने में विफल रहता है। मैं 8192 का उपयोग बफर आकार के रूप में कर रहा हूं। इसलिए मैंने इस त्रुटि को ठीक करने के लिए निम्न कॉल का उपयोग करने का प्रयास किया;

if(setsockopt(dlpifd, IPPROTO_IP, SO_SNDBUF, &val, sizeof(int)) < 0) { 
    printf("Can't set socket options:%d:%s\n", errno, strerror(errno)); 
    return 0;` 
} 

सेटॉकॉप() कॉल सफल होता है लेकिन sendto() के लिए एक ही त्रुटि है;

तो मैंने getockopt() कॉल के साथ SO_SNDBUF आकार की जांच की और यह 1 बाइट दिखाता है?

मैं क्या कर रहा हूं गलत है।

क्या लिनक्स कर्नेल को आईजीएमपी समर्थन के लिए पुन: संकलित करने की आवश्यकता है? या मुझे कुछ याद आ रहा है?

उत्तर

7

Ethernet (लिंक परत जो आप शायद सबसे अधिक काम कर रहे हैं) फ्रेम आमतौर पर 1500 बाइट लंबा होता है। send() संदेश का सटीक आकार दें, बफर आकार नहीं।

SO_SNDBUF में गिरी प्रति-सॉकेट बफर है, जो बताता है कि कितना टीसीपी के लिए बफ़र होना, यूडीपी के लिए आंकड़ारेख के आकार को सीमित है, और कच्चे सॉकेट के लिए कोई मतलब नहीं है।

+0

धन्यवाद निक! मदद के लिए। क्या इस परिदृश्य के लिए इसका मतलब है मुझे भेजने() और sendto() और सटीक संदेश आकार का उपयोग करना चाहिए (भले ही यह 1500 से अधिक डिफ़ॉल्ट आकार हो ?!) और बफ आकार नहीं। – Sathya

+0

HI, मैं एक आईजीएमपी पैकेट 'pigmp-> igmp_type = IGMP_MEMBERSHIP_QUERY भेजने की कोशिश कर रहा हूं;' और एक टीसीपी या यूडीपी नहीं, मुझे संदेह है कि कोड में जो कॉल/मैं कर रहा हूं उसका अनुक्रम गलत हो सकता है या संरचनाओं/मूल्यों का उपयोग जो मैं संरचनाओं को भरने के लिए उपयोग कर रहा हूं, गलत होना चाहिए। मैंने जांच की और उन पहलुओं में कोई गलती नहीं मिली। तो sendto() के बजाय send() का उपयोग करके इसे ठीक करने के लिए hleping नहीं है। आईजीएमपी (मल्टीकास्टिंग) पर काम करने वाला कोई भी मुझे कुछ प्रकाश डाल सकता है। - अग्रिम धन्यवाद- सत्य – Sathya

+0

हाय निक, जैसा कि कहा गया है, अब यह पैकेट आकार <= 1500 के लिए ठीक काम करता है। यह कुछ भी और (1501 के लिए भी) के लिए एरो: 90 फेंकता है। मैंने SO_SNDBUF को बढ़ाने के लिए setockopt() का उपयोग करने का प्रयास किया लेकिन उस कॉल से कोई प्रभाव नहीं पड़ा। चूंकि कच्चे सॉकेट बीसीओ के लिए भेजने() कॉल का उपयोग नहीं किया जा सकता है, यह कनेक्शन रहित है और आईजीएमपी पैकेट के लिए भी यही कारण है कि मैं अभी भी sendto() का उपयोग कर रहा हूं। मैं जानना चाहता हूं कि setockopt() से SO_SNDBUF परिवर्तन के लिए क्या अच्छा है। - धन्यवाद - सत्य – Sathya

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