2011-01-09 6 views
5

मैं एक सी प्रोग्राम बना रहा हूं जिसमें मुझे गंतव्य कंप्यूटर पर खुले यूडीपी बंदरगाहों की जांच करने की आवश्यकता है। चूंकि यूडीपी कनेक्शन रहित है, इसलिए मैं connect() के वापसी मूल्य की जांच नहीं कर सकता जैसा कि मैं टीसीपी के साथ कर सकता हूं।मैं कैसे बता सकता हूं कि मैंने एक यूडीपी पैकेट को एक खुले बंदरगाह में भेजा है?

send() और sendto() वापसी मूल्य भी कोई मदद नहीं है। मैन्युअल पृष्ठ कहता है:

No indication of failure to deliver is implicit in a send(). Locally 
    detected errors are indicated by a return value of -1. 

अगर मैं गंतव्य होस्ट पर एक खुला बंदरगाह के लिए एक यूडीपी पैकेट भेजा मैं कैसे बता सकते हैं?

उत्तर

6

आम तौर पर आप इसे नहीं कर सकते हैं।

सिद्धांत रूप में, बंद बंदरगाह वाले एक मेजबान को आईसीएमपी पोर्ट-पहुंच योग्य वापस भेजना चाहिए। लेकिन वे अक्सर नहीं करते हैं; इसी तरह, एक डाउन या पहुंच योग्य मेजबान ऐसा संदेश नहीं भेजेगा। इसके अलावा, कुछ फ़ायरवॉल संदेश को अवरुद्ध करेंगे।

त्रुटि पुनर्प्राप्त करना भी समस्याग्रस्त है। लिनक्स अच्छी तरह से परिभाषित है, लेकिन सॉकेट पर त्रुटियों को पुनः प्राप्त करने के लिए अर्थशास्त्र को भ्रमित कर रहा है (कुछ जानकारी के लिए विभिन्न मैन पेज, सॉकेट (7), आईपी (7) और udp (7) देखें)। उदाहरण के लिए जब आप एक असंबंधित sendto() करते हैं तो आपको कभी-कभी पिछली त्रुटि दिखाई देगी। विशिष्ट सॉकेट त्रुटियों को पुनर्प्राप्त करने के लिए अन्य ओएस में थोड़ा भिन्न तंत्र है।

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

+1

यह पूछने के लिए खेद है लेकिन मैं कैसे देख सकता हूं कि उसने मुझे आईसीएमपी पोर्ट-पहुंच योग्य नहीं भेजा है? धन्यवाद। – Marian

+0

@Marian: क्या आप इसके लिए एक और सवाल कर सकते हैं? मुझे भी जानना अच्छा लगेगा। –

+0

मुझे वास्तव में नहीं लगता कि आईसीएमपी पोर्ट-पहुंच योग्य नहीं है, क्योंकि यह नहीं पहुंच सकता है। यह विशेष रूप से उन कंप्यूटरों के लिए सच है जिनके पास "व्यक्तिगत फ़ायरवॉल" उत्पाद स्थापित हैं जो ऐसी उपयोगी चीजों को अवरुद्ध करते हैं (ज्यादातर) गुमराह सुरक्षा कारणों से। – MarkR

2

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

आपको इसे भेजने और प्राप्त करने दोनों में निश्चित रूप से डिजाइन करना होगा।

+1

ओह ... तो फिर जांच करने का कोई सही तरीका नहीं है। धन्यवाद – Marian

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