2016-08-25 4 views
3

Je veux vérifier si un certain port est ouvert sur un hôte donné. Comment puis je faire ça? Après avoir appelé connectTo et quelle est la prochaine étape, comment puis-je savoir si un port est ouvert?Je veux vérifier si un certain port est ouvert (Haskell) ou non?

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

Si l'hôte est protégé par port knocking, même Nmap pense que tous ses ports sont fermés. Comment exactement voulez-vous interroger les ports? –

+0

@ V.Semeria, nous pouvons supposer qu'il n'est pas protégé. – Dorkajo

Répondre

2

Si connectTo renvoie, le port est ouvert. Sinon, il lancer des exceptions comme

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

ou

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

Vous pouvez faire

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

il retourne toujours False, en particulier pour localhost. L'as tu essayé? – Dorkajo

+0

Oui, je l'ai essayé sur localhost, avec un petit serveur web que j'ai sur ma machine. Vous pouvez vérifier quelle exception il jette dans votre cas. –

+0

ou peut-être pas toujours, mais il semble dans certains cas qu'il renvoie faux au lieu de vrai. – Dorkajo