Linux socket programming debug? -


मेरे पास ऐसा फ़ंक्शन है:

  स्थिर इंट rcv_kern (int sock, void * Buf, int len, struct sockaddr * addr, socklen_t * addrlen) {struct टाइमवेवल टाइमआउट = {1, 0}; Fd_set सेट; पूर्णांक स्थिति; FD_SET (जुर्राब, और सेट); यदि ((स्थिति = चयन करें (सॉक + 1, और सेट, नल, नल, और टाइमआउट)) == 0) {एफडी_जीरो (और सेट); Fprintf (stderr, "कर्नेल से उत्तर प्राप्त करते समय टाइमआउट \ n"); बाहर निकलने के (1); } और अगर (स्थिति == -1) {FD_ZERO (और सेट); गड़बड़ ("रिकवफॉर्मम असफल"); बाहर निकलने के (1); } FD_ZERO (& amp; सेट); रिवर्फफ्रॉम (सॉक, बफ़, लेन, 0, एड्रर, एडरलेन); }  

जिसका उपयोग कर्नल स्पेस से संदेश प्राप्त करने के लिए उपयोग किया जाता है। लेकिन जब मैं इसे चलाता हूं, तो परिणाम हमेशा कहते हैं कि स्रोत कोड से, "संदेश कर्नेल से उत्तर प्राप्त करते समय समयबाह्य होता है", इस कारण से कारण होता है कि "चयन" पद्धति हमेशा '0' वापस करती है मुझे इसका कारण पता नहीं है, जो मुझे कुछ सुझाव दे सकता है, धन्यवाद।

चार्ली,
कुछ चीजें:

1) आपको संभवतः अपने चयन () कॉल के आसपास लूप चाहिए और केवल अगर आपके फाइल डिस्क्रिप्टर पर FD_ISSET () रिटर्न रिवर्फ से कॉल करें।
2) सुनिश्चित करें कि आपका वास्तविक ड्राइवर या कर्नल कोड जो नेटलिंक सॉकेट पर भेज रहा है वास्तव में इसे लिख रहा / भेज रहा है यदि नहीं, तो आपके फ़ंक्शन का समय समाप्त होगा यदि उसे 1 सेकंड में डेटा प्राप्त नहीं होता है (जो कि आपने समय समाप्ति निर्धारित किया है)।

कुछ सामान्य टिप्पणियां ... लिनक्स में, चयन () सिस्टम कॉल का उपयोग करते समय टाइमआउट डेटा संरचना प्रत्येक कॉल के बाद रीसेट हो जाती है, इसलिए यदि आप अपने कोड को चयन के चारों ओर लूप में बदलते हैं, जो आपको शायद करना चाहिए .. आपको लूप में प्रत्येक आवृत्ति के लिए अपना टाइमआउट मान रीसेट करना होगा।

इसके अलावा, अगर समय का चयन करें, इसका जरूरी मतलब नहीं है कि यह एक त्रुटि है याद रखें, चयन एक गैरब्लॉकिंग कॉल है यह दिए गए 'टाइमआउट' अवधि और रिटर्न के लिए सॉकेट पर बस इंतजार करेगा। यदि आप फ़ाइल डिस्क्रिप्टर से पढ़ने के लिए चाहते हैं तो चाहे क्या ... जिसका अर्थ है कि आप अपने recv_kern () समारोह को ब्लॉक करने के लिए चाहते हैं जब तक कि डेटा वापस करने के लिए न हो, तब चयन का उपयोग करने पर परेशान न करें ()। बस फ़ाइल डिस्क्रिप्टर पर recvfrom () सीधे कॉल इस तरह से आपके recv_kernel () फ़ंक्शन ब्लॉक होगा और केवल उस डेटा को पढ़ने के बाद वापस लौटाएगा जो कर्नेल भेजा गया था।


यह विशिष्ट प्रकार की मदद के लिए अधिक विशिष्ट मदद देने के लिए यहां पर संदर्भ के बारे में अधिक जानने के लिए कड़ी मेहनत उपयोग किया जा रहा है। मैं मान रहा हूं कि यह एक कस्टम कर्नेल मॉड्यूल है जो आपने लिखा है कि यूज़रस्पेस को डाटा भेज रहा है, सही है?
ब्लॉक करने के लिए अपना रिकव_कर्न () फ़ंक्शन बदलने की कोशिश करें (चयन कोड को चुनें और सिर्फ रिकवफ्रेम () को कॉल करें)। यह तरीका यह बताने में सक्षम होना चाहिए कि क्या आपका कर्नेल ड्राइवर वास्तव में उपयोगकर्ताओं को ठीक से डेटा भेज रहा है। यदि आप recvfrom () पर अवरुद्ध कर रहे हैं और कुछ भी हर वापस नहीं आता है .. तो आप भी अपने कर्नेल ड्राइवर में एक समस्या हो सकती है

उम्मीद है कि मदद करता है।


Comments

Popular posts from this blog

python - Overriding the save method in Django ModelForm -

html - CSS autoheight, but fit content to height of div -

qt - How to prevent QAudioInput from automatically boosting the master volume to 100%? -