2010-06-14 17 views
5

भेज रहा है मैं एक एम्बेडेड लिनक्स वातावरण में काम कर रहा हूं।टेलनेट क्लाइंट कनेक्शन डेटा प्राप्त करना बंद कर देता है, सर्वर अभी भी

यह स्टार्टअप पर एक टेलनेट डिमन लॉन्च करता है जो किसी विशेष पोर्ट पर देखता है और कनेक्शन प्राप्त होने पर एक प्रोग्राम लॉन्च करता है।

अर्थात

telnetd -l /usr/local/bin/PROGA -p 1234 

PROGA - इच्छा उत्पादन अनियमित अंतराल पर कुछ डेटा। जब यह डेटा आउटपुट नहीं कर रहा है, तो प्रत्येक एक्स अवधि के समय यह ग्राहक को यह जानने के लिए 'दिल की धड़कन' प्रकार की स्ट्रिंग भेजता है कि हम अभी भी सक्रिय हैं यानी "दिल की धड़कन \ r \ n"

यादृच्छिक समय के बाद, ग्राहक (द्वारा शुरू टेलनेट का एक लिनक्स संस्करण, का उपयोग करें: telnet xxx.xxx.xxx.xxx 1234) असफल हो जायेगी प्राप्त करने के लिए 'दिल की धड़कन \ r \ n'

डेटा ग्राहक देखता है:

heartbeat 
heartbeat 
heartbeat 
... 
heartbeat 
[nothing, should have received heartbeat] 
[nothing forever] 

दिल की धड़कन भेज दिया जाता है:

result = printf("%s", heartbeat); 

जांच परिणाम, यह हमेशा heartbeat की लंबाई है। syslog में प्रवेश हो रहा है हमें पता चलता है कि printf() उचित अंतराल

मैं के बाद से एक tcdrain और fflush जो दोनों लौट सफलता में जोड़ दिया है पर सफलता के साथ निष्पादित हो रहा है, लेकिन स्थिति में मदद करने के नहीं है।

किसी भी मदद की सराहना की जाएगी।

** UDPATE: सर्वर पक्ष से एक वायरशर्क कैप्चर मिला। बहुत स्पष्ट रूप से दिल की धड़कन लगातार भेजा जा रहा है। कोई हिचकिचाहट नहीं, कोई देरी नहीं है। हालांकि ग्राहक पर कुछ दिलचस्प पाया। इस टेस्ट केस में क्लाइंट (उबंटू 9.04 पर टेलनेट) अचानक दिल की धड़कन (जैसे ऊपर वर्णित) प्राप्त करना बंद कर देता है। Wireshark यह पुष्टि करता है, पैकेट में बड़ा विराम। खैर, एक बार जब ग्राहक दिल की धड़कन प्राप्त करना बंद कर देता था, तो किसी भी कीस्ट्रोक (क्लाइंट पर) दबाकर क्लाइंट के बफर (सभी दिल की धड़कन) से डेटा का एक स्पू ट्रिगर होता है। क्लाइंट पर वायर्सहार्क भी एक पैकेट में इस विशाल मात्रा में डेटा दिखाता है।

दुर्भाग्य से मुझे वास्तव में यह नहीं पता कि इसका क्या अर्थ है। यह एक लाइन मोड चालू/बंद चीज है? लाइन अंत (\ r \ n) बहुत स्पष्ट रूप से आ रहे हैं।

** अपडेट 2: टेलनेट के बजाए नेटकैट चलाना, समस्या पुन: उत्पन्न नहीं होती है।

+0

आपके द्वारा भेजे जाने वाले अन्य तारों की तरह क्या दिखता है? यदि आप 255 बाइट भेजते हैं तो इसे बचने की जरूरत है ... – Spudd86

+0

मुझे नहीं लगता कि अन्य तार प्रासंगिक हैं, क्योंकि इस बग/समस्या को फिर से 'दिल की धड़कन' स्ट्रिंग भेजकर पुन: उत्पन्न किया जा सकता है – Tree77

उत्तर

1

पहली चीज जो मैं करूँगा वह वायरशर्क से बाहर निकलती है और यह पता लगाने की कोशिश करती है कि सर्वर वास्तव में संदेश भेज रहा है या नहीं। सर्वर पर साथ ही तीसरे पक्ष के पीसी पर वायरशर्क चलाने के लिए निर्देशक होगा। क्या आखिरी दिल की धड़कन के बारे में कुछ अलग है?


संपादित करें। अच्छा, यह आपके ग्राहक पर एक दिलचस्प खोज था।

ऐसा लगता है कि रास्ते में कुछ प्रकार की टर्मिनल चीज है। आप telnetd की बजाय नेटकैट प्रोग्राम का उपयोग करना चाह सकते हैं। नेटकैट को किसी भी विशेष प्रारूपण के बिना कच्चे मोड में एक टीसीपी सत्र पर मनमाना डेटा भेजने के लिए डिज़ाइन किया गया है, और इसमें सॉकेट में मनमाने ढंग से प्रक्रिया को अपनाने की क्षमता है। एक विंडोज मशीन पर आप एक ही चीज को पूरा करने के लिए कच्चे मोड में पुटी का उपयोग कर सकते हैं।

यह अभी भी आपके ग्राहक और सर्वर के बीच किसी तीसरे पक्ष के साथ यातायात की जांच करने लायक हो सकता है। कर्नेल नेटवर्क को लिखने और आंतरिक रूप से डेटा को बफर करने के अनुकूल हो सकता है। यह सुनिश्चित करने का एकमात्र तरीका है कि तार पर वास्तव में क्या हो रहा है।

+0

हाँ मेरे पास था एक दिन पहले डेटा कैप्चर करने के लिए वायरशर्क का विचार। मुझे क्लाइंट से वायरशर्क डेटा मिला। यह दिल की धड़कन नहीं देख रहा है। मैं सर्वर से वायरशर्क प्राप्त करने पर काम कर रहा हूं। जब मुझे वह डेटा मिलता है तो प्रश्न अपडेट हो जाएगा। दिल की धड़कन के बारे में कुछ भी अलग या गतिशील नहीं है। लिनक्स क्लाइंट (परीक्षण के लिए) उबंटू 9.04 के साथ टेलनेट क्लाइंट है – Tree77

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