почему nmap показывает, что мой tcp-сервер не прослушивает порт, который должен быть? - PullRequest
1 голос
/ 25 сентября 2011

Я намерен использовать этот код, нашел здесь Однако я заметил, что могу подключиться к этому серверу на локальном хосте. Не может с другого компьютера. Я сделал быстрое сканирование Nmap, которое показало, что на выбранном мной порту ничего не слушалось. В целях устранения неполадок я отключил брандмауэр, поэтому исключил это как возможную проблему.

Подсказки от программистов Windows на Haskell приветствуются.

Ответы [ 3 ]

2 голосов
/ 25 сентября 2011

Похоже, что сокет был привязан к localhost (127.0.0.1), поэтому вы не можете подключить его с другой машины, а он только с локальной машины.Попробуйте использовать Bind API, чтобы сначала создать сокет, а затем привязать сокет к «Любому адресу», который связывает сокет с каждым интерфейсом, доступным на локальной машине.

1 голос
/ 27 сентября 2011

Это для будущих новых хаскелеров. Я основал свой код на этом примере . Я сделал улучшения, основанные на этой ветке reddit и предложениях, сделанных выше. Операторы импорта все еще неаккуратны, но их исправление оставлено как общеизвестное «упражнение для читателя». Я приглашаю любые дополнительные предложения, ведущие к улучшениям.

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 голос
/ 25 сентября 2011

Я обычно иду с

netstat -an | grep LISTEN

Если вы видите порт в списке, что-то прослушивает.Я не могу вспомнить, что команда lsof предназначена для сокетов, и Google не отказывается от товаров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...