2012-08-06 22 views
14

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

कोड मैं अभी वास्तव में काम करने के लिए प्रतीत नहीं होता है ...

private void ScanPort() 
{ 
    string hostname = "localhost"; 
    int portno = 9081; 
    IPAddress ipa = (IPAddress) Dns.GetHostAddresses(hostname)[0]; 
    try 
    { 
     System.Net.Sockets.Socket sock = 
       new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, 
               System.Net.Sockets.SocketType.Stream, 
               System.Net.Sockets.ProtocolType.Tcp); 
     sock.Connect(ipa, portno); 
     if (sock.Connected == true) // Port is in use and connection is successful 
      MessageBox.Show("Port is Closed"); 
     sock.Close(); 
    } 
    catch (System.Net.Sockets.SocketException ex) 
    { 
     if (ex.ErrorCode == 10061) // Port is unused and could not establish connection 
      MessageBox.Show("Port is Open!"); 
     else 
      MessageBox.Show(ex.Message); 
    } 
} 
+0

यह कैसे विफल हो जाता है? क्या परिणाम अपेक्षित नहीं हैं, क्या आपको अपवाद मिल रहा है? – TheEvilPenguin

+0

यदि आपका कोड पोर्ट से कनेक्ट होता है तो यह भी कहना चाहिए कि पोर्ट बंद नहीं है –

+0

@TheEvilPenguin मैं यह कहना चाहता हूं कि मेरा पोर्ट खुला है क्योंकि मैंने इसे अपने राउटर में अग्रेषित किया है, लेकिन यह कनेक्ट करने में विफल रहा है ... –

उत्तर

23

इस प्रयास करें:

using(TcpClient tcpClient = new TcpClient()) 
{ 
    try { 
     tcpClient.Connect("127.0.0.1", 9081); 
     Console.WriteLine("Port open"); 
    } catch (Exception) { 
     Console.WriteLine("Port closed"); 
    } 
} 

आप शायद 127.0.0.1 192.168.0.1 की तरह कुछ में बदल जानी चाहिए या जो भी आपके राउटर का आईपी पता है।

+0

यह अभी भी नहीं करता है अगर मैं 1 9 2.168.1.1 –

+0

का उपयोग करता हूं तो काम नहीं करता है जब आप कोड का उपयोग करने का प्रयास करते हैं तो क्या होता है? –

+0

यह कहता है कि बंदरगाह खुला होने पर भी यह कनेक्ट नहीं हो सकता है। –

2

आप loopback adapterlocalhost या 127.0.0.1 (there's no place like 127.0.0.1!) से कनेक्ट कर रहे हैं, तो आप कभी रूटर से बाहर जाने की संभावना नहीं कर रहे हैं। ओएस यह समझने के लिए पर्याप्त स्मार्ट है कि यह एक विशेष पता है। डुनो अगर यह सच भी है तो आप वास्तव में अपनी मशीन के "वास्तविक" आईपी पते को निर्दिष्ट करते हैं। What is the purpose of the Microsoft Loopback Adapter?

यह भी ध्यान रखें (Windows में tracert localhost) traceroute localhost चल पता चलता है कि केवल नेटवर्क नोड शामिल अपनी खुद की मशीन है:

भी इस प्रश्न देखें। राउटर कभी शामिल नहीं है।

1

राउटर पर आगे एक पोर्ट को लैन के अंदर से परीक्षण नहीं किया जा सकता है, आपको यह देखने के लिए WAN (इंटरनेट) पक्ष से कनेक्ट करने की आवश्यकता है कि कोई पोर्ट आगे काम कर रहा है या नहीं।

कई इंटरनेट साइटों की जाँच करने के सेवाओं की पेशकश करता है, तो एक बंदरगाह खुला है:

What's My IP Port Scanner

GRC | ShieldsUP!

आप अपने खुद के कोड के साथ जाँच करना चाहते हैं, तो आप बनाने की जरूरत है सुनिश्चित करें कि टीसीपी/आईपी ​​कनेक्शन बाहरी प्रॉक्सी के माध्यम से फिर से शुरू किया जाता है या एक सुरंग स्थापित किया जाता है। यह अपने कोड के साथ कोई संबंध नहीं है, यह बुनियादी नेटवर्किंग है 101.

12

एक बेहतर समाधान जहां भी समय समाप्त निर्दिष्ट कर सकते हैं:

bool IsPortOpen(string host, int port, TimeSpan timeout) 
{ 
    try 
    { 
     using(var client = new TcpClient()) 
     { 
      var result = client.BeginConnect(host, port, null, null); 
      var success = result.AsyncWaitHandle.WaitOne(timeout); 
      if (!success) 
      { 
       return false; 
      } 

      client.EndConnect(result); 
     } 

    } 
    catch 
    { 
     return false; 
    } 
    return true; 
} 

और, एफ # में:

let IsPortOpen (host: string, port: int, timeout: TimeSpan): bool = 
    let canConnect = 
     try 
      use client = new TcpClient() 
      let result = client.BeginConnect(host, port, null, null) 
      let success = result.AsyncWaitHandle.WaitOne(timeout) 
      match success with 
      | false -> false 
      | true -> 
        client.EndConnect(result) 
        true 
     with 
     | _ ->(); false 
    canConnect 
+0

यह विधि कितनी सक्षम है? विशेष रूप से एफ # में? मैं नेटवर्क प्रोटोकॉल के लिए थीसिस पर काम कर रहा हूं और (प्री) प्रक्रिया का हिस्सा उपलब्ध बंदरगाहों की एक सूची लिखना है। – czifro

+0

यह सी # एक के रूप में प्रदर्शन करने वाला होना चाहिए ... लेकिन इसे स्वयं ही मापें? – ympostor

+0

क्या यह पैटर्न पैटर्न.Net.Sockets.UdpClient के लिए उपयोग किया जा सकता है? – tatmanblue

2

नहीं है यह जानने का कोई तरीका नहीं है कि पोर्ट को आपके राउटर में अग्रेषित किया गया है, सिवाय इसके कि उस बंदरगाह में कोई प्रोग्राम सुन रहा है या नहीं।

जैसा कि आप क्लिंटन में देख सकते हैं, नेट क्लास का उपयोग टीसीपी क्लाइंट है और ऐसा इसलिए है क्योंकि आप कनेक्ट करने के लिए एक टीसीपी सॉकेट का उपयोग कर रहे हैं। ऑपरेटिंग सिस्टम कनेक्शन बनाने का तरीका है: एक सॉकेट का उपयोग करना। हालांकि, राउटर केवल पैकेट (ओएसआई मॉडल की परत 3) को अंदर या बाहर आगे बढ़ाता है। आपके मामले में आप राउटर क्या कर रहे हैं: एनएटी। यह एक या एक से अधिक निजी आईपी द्वारा साझा किया गया एक सार्वजनिक आईपी है। यही कारण है कि आप एक पोर्ट अग्रेषण कर रहे हैं।

पैकेट के रास्ते में बहुत सारे राउटर हो सकते हैं और आपको कभी पता नहीं चलेगा कि क्या हुआ था।

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

मैंने एनएमएपी सॉफ़्टवेयर का उल्लेख करते हुए एक जवाब देखा। यह वास्तव में एक बहुत अच्छा और जटिल मुलायम है, लेकिन मुझे लगता है कि यह वैसे ही काम करेगा। अगर उस बंदरगाह में कोई ऐप नहीं सुन रहा है, तो यह जानने का कोई तरीका नहीं है कि यह खुला है या नहीं।

कृपया मुझे बताएं कि क्या मैं स्पष्ट था।

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