2017-04-12 3 views
1

下記の簡単なJavaメソッドを書いて、Port 21がFedora Linuxで使用されているかどうかを確認しました。それは既に使用中であると報告しました。JavaのServerSocketがnetstat -antと同意しないのはなぜですか?

protected static boolean isPortInUseTCP(final int port) 
{ 
    Log.info("Checking TCP ports [" + port + "]", Verbosity.MEDIUM); 

    // Checks to see if the port is available (not in use), otherwise drop 
    // into the catch block if it is already used 
    try (ServerSocket ss = new ServerSocket(port)) 
    { 
     ss.setReuseAddress(true); 

     Log.info("Port number [" + port + "] not found via TCP port", Verbosity.MEDIUM); 

     return false; 
    } 

    catch (IOException exc) 
    { 
     Log.info("Port number [" + port + "] found via TCP port", Verbosity.MEDIUM); 
    } 

    return true; 
} 

しかし、それは、Javaと一致するかどうかを確認するためにnetstat -antをチェックするとき、それは使用中としてポート21を表示されませんか?どうして? enter image description here

+0

例外が記録されたときにログに記録してください。 – f1sh

答えて

2

21が使用されているかどうかは、Javaコードでは表示されません。それは21で聞くことができるかどうかを示します。 21は特権ポートであるため、取得している例外はおそらく不足している特権に不平を言うでしょう。

例外については想定しないでください。ここでは、ポートが使用中であり、そのポートで待機するために必要な権限を持っていないことを前提に、完全に無視しています。

Javaプログラムをroot(悪い考え方)として実行すると、そのポートが使用されていないことがわかります。

+0

はい、netstat -antが正確であるため、ポートが使用されていないことが予想されます。私はグーグルで、私は多くの人が私と同じ論理をやっているのを見ました。あなたが答えに頼っているのではなく、ポートが使用されていないかどうかをチェックする最も良い方法は何でしょうか? – Trevor

+0

おそらくどこかに重複があります。 – Kayaman

+0

実際にプログラムを 'root'として実行するべきではないことに注意してください。 1024未満のポートを使用する場合は、適切な特権を与えるだけです。 – Kayaman

0

はい、正しくポート21は特権ポートであり、例外は文句を言いました - java.net.BindException: Permission denied (Bind failed)です。

私はrootでプログラムを実行すると、私は正しい答えを得ました。それは港が使用されていないと言いました。だから私の問題は、私が最初に適切な特権に自分自身をエスカレートしなかったということでした。私の間違いを指摘してくれてありがとう。