2016-08-25 2 views
3

특정 호스트에서 특정 포트가 열려 있는지 여부를 확인하고 싶습니다. 어떻게해야합니까? connectTo을 호출하고 다음 단계가 끝나면 실제로 포트가 열려 있는지 어떻게 알 수 있습니까?특정 포트가 열렸는지 확인하고 싶습니다 (하스켈)?

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)) 

같은 예외를 throw합니다. 얼마나 정확하게 포트를 쿼리 하시겠습니까? –

+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

항상 False를 반환합니다 (특히 localhost의 경우). 너 해봤 어? – Dorkajo

+0

예 로컬 호스트에서 내 컴퓨터에있는 작은 웹 서버를 사용해 보았습니다. 귀하의 경우에 예외가 무엇인지를 확인할 수 있습니다. –

+0

또는 항상 그런 것은 아니지만 경우에 따라서는 true 대신 false를 반환합니다. – Dorkajo

관련 문제