2011-09-25 33 views
1

我打算建立在這個代碼上,發現here 但是,我注意到我可以telnet到本地主機上的這臺服務器。不能從另一臺電腦。我做了一個快速的nmap掃描,報告沒有任何人在我選擇的端口上收聽。 爲了排除故障的目的,我關閉了防火牆,所以我認爲這是一個可能的問題。爲什麼nmap顯示我的tcp服務器沒有監聽它應該是的端口?

來自haskell windows程序員的線索將不勝感激。

+1

你使用了什麼'nmap'標誌?更簡單的使用'netstat -a -p tcp' –

回答

1

這是爲未來的新haskellers。 我基於this example上的我的代碼。 我根據this reddit thread進行了改進,並提出了上述建議。進口報表仍然sl,不馴,但修正這些報表仍是衆所周知的「讀者習慣」。我邀請任何其他建議導致改進。

import Network.Socket 
import Control.Monad 
import Network 
import System.Environment (getArgs) 
import System.IO 
import Control.Concurrent (forkIO) 

main :: IO() 
main = withSocketsDo $ do 
    [portStr] <- getArgs 
    sock <- socket AF_INET Stream defaultProtocol 
    let port = fromIntegral (read portStr :: Int) 
     socketAddress = SockAddrInet port 0000 
    bindSocket sock socketAddress 
    listen sock 1 
    putStrLn $ "Listening on " ++ (show port) 
    sockHandler sock 

sockHandler :: Socket -> IO() 
sockHandler sock' = forever $ do 
    (sock, _) <- Network.Socket.accept sock' 
    handle <- socketToHandle sock ReadWriteMode 
    hSetBuffering handle NoBuffering 
    forkIO $ commandProcessor handle 

commandProcessor :: Handle -> IO() 
commandProcessor handle = forever $ do 
    line <- hGetLine handle 
    let (cmd:arg) = words line 
    case cmd of 
     "echo" -> echoCommand handle arg 
     "add" -> addCommand handle arg 
     _ -> do hPutStrLn handle "Unknown command" 

echoCommand :: Handle -> [String] -> IO() 
echoCommand handle arg = do 
    hPutStrLn handle (unwords arg) 

addCommand :: Handle -> [String] -> IO() 
addCommand handle [x,y] = do 
    hPutStrLn handle $ show $ read x + read y 
addCommand handle _ = do 
    hPutStrLn handle "usage: add Int Int" 
1

我通常

netstat -an | grep LISTEN

去如果您看到列出的端口,東西正在監聽。我不記得lsof命令是用於套接字的,Google不會放棄這些商品。

+2

它是'lsof -i:port' – lunixbochs

2

看來,套接字綁定到本地主機(127.0.0.1),這就是爲什麼你無法連接它從其他機器,它只能從本地機器連接。嘗試使用Bind API首先創建套接字,然後將套接字綁定到將套接字綁定到本地計算機上可用的每個接口的「任意地址」。

+0

這是最有意義的。我會在今天晚些時候嘗試。 –

+0

我正在改進基於關於此tcp服務器示例的reddit文章的代碼。當我準備批評時,我會發布我所做的。 –

相關問題