2016-08-25 6 views
3

特定のホストで特定のポートが開いているかどうかをチェックします。どうやってやるの? connectToと呼んだ後で、ポートが開いているかどうかを実際にどのように知ることができますか?特定のポート(Haskell)が開いているかどうかチェックしたいですか?

main = do 
    withSocketsDo $ do 
    h <- connectTo "some_host.com" $ PortNumber 1234 
    --- and....? 
+0

を行うことができ

*** Exception: connect: failed (Connection timed out (WSAETIMEDOUT)) 

または

*** Exception: connect: failed (Connection refused (WSAECONNREFUSED)) 

のような例外がスローされます。どのくらい正確にポートを照会したいですか? –

+0

@ V.Semeria、それは保護されていないと見なすことができます。 – Dorkajo

答えて

2

connectToが返る場合、ポートは開いています。それ以外の場合は、ホストが、でも、nmapのすべてのポートが閉じていると思いますportknockingで保護されている場合あなたが

import Network(connectTo, PortID(..), PortNumber(..)) 
import Control.Exception(try, SomeException) 
import System.IO(Handle) 

isPortOpen :: String -> PortNumber -> IO Bool 
isPortOpen host port = do 
    h <- try $ connectTo host (PortNumber port) :: IO (Either SomeException Handle) 
    return $ case h of 
    Left _ -> False 
    Right _ -> True 
+0

常に、特にlocalhostに対してFalseを返します。あなたはそれを試してみましたか? – Dorkajo

+0

はい私は自分のマシン上にある小さなWebサーバーを使ってlocalhostで試しました。あなたはあなたのケースでどのような例外がスローされたかを確認できます。 –

+0

、または必ずしもそうではないかもしれませんが、場合によっては真ではなく偽を返します。 – Dorkajo

関連する問題