2012-08-06 17 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"); 
    } 
} 

おそらく、192.168.0.1のようなものに127.0.0.1を変更する必要がありますまたはあなたのルータのIPアドレスが何であっても。

+0

それでも192.168.1.1を使用すると動作しません –

+0

コードを使用しようとするとどうなりますか? –

+0

ポートが開いていても接続できないということです。 –

2

あなたはloopback adapterlocalhostまたは127.0.0.1there's no place like 127.0.0.1!)に接続している場合、あなたはルータに出て行く可能性は低いです。 OSはそれが特別なアドレスであることを認識するほどスマートです。実際のマシンの「実際の」IPアドレスを実際に指定している場合は、それが真である場合はDunnoを使用してください。

What is the purpose of the Microsoft Loopback Adapter?はまた、(Windowsでtracert localhosttraceroute localhostを実行すると、関連する唯一のネットワークノードは、自分のマシンであることを示していることに注意してください:

も、この質問を参照してください。ルータは決して関与しません。

1

ルーターのポートフォワードをLAN内部からテストすることはできません。ポートフォワードが機能しているかどうかを確認するには、WAN(インターネット)側から接続する必要があります。

いくつかのインターネットサイトは、ポートが開いているかどうかを確認するためにサービスを提供しています:

What's My IP Port Scanner

GRC | ShieldsUP!

あなたがあなた自身のコードを確認したい場合は、あなたはTCPを確認する必要があります/ IP接続は、外部プロキシ経由で再ルーティングされるか、トンネルを設定します。

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; 
} 

そして、F#で:

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 
12

よりよい解決策の基本的なネットワークですそのポートでリッスンしているプログラムがある場合を除いて、そのポートがあなたのルータで転送されているかどうかを知る方法はありません。

Clintonの回答で使用されている.NetクラスはTcpClientです。これは、TCPソケットを使用して接続しているためです。これが、オペレーティングシステムが接続する方法です:ソケットを使用する。しかし、ルータはパケット(OSIモデルのレイヤ3)を内外に転送するだけです。あなたのケースでは、ルーターはNATと呼ばれるものをやっています。 1つ以上のプライベートIPによって共有される1つのパブリックIPです。それがポートフォワーディングを行っている理由です。

パケットの経路に多くのルータが存在する可能性があり、何が起こったのかは決して分かりません。

伝統的な方法で手紙を送っているとしましょう。おそらくあなたは、レシーバーがあなたにそこにいることを確認するためにあなたに答える必要があるという手紙を書くことができます(あなたとレシーバーはソケットです)。あなたが答えを受け取ったら、彼/彼女はそこにいると確信しますが、何も受け取らないなら、郵便配達人(あなたの場合はルータ)が手紙を送付するのを忘れた、または受取人が持っていなかったこと答えた。郵便配達員が友人にその手紙を届けるよう依頼したかどうかも決して分かりません。さらに、郵便配達員は、あなたが返事を待っているので、彼/彼女が答えるかもしれないことを知るために手紙を開くことができません。あなたがしてもよいのは、答えを受け取るまでにしばらくお待ちください。あなたがその期間に何も受け取らないなら、あなたはレシーバーが手紙を送っていないと仮定します。それは「タイムアウト」です。

私はnmapソフトウェアについて言及しました。それは本当に非常に良いと複雑なソフトですが、私はそれが同じように動作すると思います。そのポートでリッスンしているアプリがない場合、開いているかどうかを知る方法はありません。

私が明確であるかどうか教えてください。

+0

このメソッドはどのように機能しますか?特にF#で?私はネットワークプロトコルのための論文に取り組んでいます、そして、(予備の)プロセスの一部は利用可能なポートのリストを構成することです。 – czifro

+0

それはC#のものと同じように演奏するべきです...しかし、それのためにちょうどそれを測定しますか? – ympostor

+0

このパターンをSystem.Net.Sockets.UdpClientに使用できますか? – tatmanblue

2

ありますあなたのコードとは何の関係もありませんこれは、それはあなたもタイムアウトを指定することができます101

関連する問題