2016-08-25 9 views
3

Ich möchte überprüfen, ob ein bestimmter Port auf einem bestimmten Host geöffnet ist oder nicht. Wie kann ich das machen? Nachdem ich connectTo angerufen habe und was als nächstes, wie kann ich wirklich wissen, wenn ein Hafen geöffnet ist?Ich möchte überprüfen, ob ein bestimmter Port offen ist (Haskell)?

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

tun Wenn der Host von Portknocking geschützt ist, auch nmap denken alle seine Ports geschlossen sind. Wie genau wollen Sie die Ports abfragen? –

+0

@ V.Semeria, wir können davon ausgehen, dass es nicht geschützt ist. – Dorkajo

Antwort

2

Wenn connectTo zurückkehrt, ist der Port offen. Sonst wird es Ausnahmen wie

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

oder

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

werfen So könnte man

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

es gibt immer False zurück, insbesondere für localhost. Hast du es versucht? – Dorkajo

+0

Ja, ich habe es auf localhost versucht, mit einem kleinen Webserver, den ich auf meinem Rechner habe. Sie können prüfen, welche Ausnahme in Ihrem Fall ausgelöst wird. –

+0

oder vielleicht nicht immer, aber es scheint in einigen Fällen, dass es falsch statt wahr zurückgibt. – Dorkajo

Verwandte Themen