2012-04-27 3 views
0

я задал вопрос о сигнале на окнах с тем же кодом, вот еще один вопросВ Haskell сокете не удалось на окнах

import IO 
import Control.Exception hiding (catch) 
import Control.Concurrent 
import Network 

main = withSocketsDo $ do {main'} 
main' = listenOn (PortNumber 9900) >>= acceptConnections 

acceptConnections sock = do 
     putStrLn $ "trying to accept" ++ (show sock)-- debug msg 
     [email protected](h,host,port) <- accept sock 
     print conn -- debug msg 
     forkIO $ catch (talk conn `finally` hClose h) (\e -> print e) 
     acceptConnections sock 

talk [email protected](h,_,_) = hGetLine h >>= hPutStrLn h >> hFlush h >> talk conn 

я запустить программу на win7, и это похоже на сокет, созданный успеха , но я не могу подключиться к telnet, а netstat не показывает никакого прослушивающего сокета с процессом, есть ли что-то не так? Или у haskell есть ошибка на окнах? (Кстати, на debian с этим кодом работает отлично)

+0

Работает отлично для меня в ghci и при компиляции. Im на win7 64bit. Возможно, это что-то делать с настройками сети/брандмауэра? –

+0

thks для вашего ответа, я нашел проблему и ответил ниже, но я до сих пор не знаю, почему ваша система работает нормально, может ли telnet на сервере получить эхо? – vzex

ответ

1

Когда я использую netstat -a на win7, я обнаружил, что прослушивающий ip с портом 9900 is [::], ни 127.0.0.1, ни 0.0.0.0, поэтому я думаю, что проблема заключается в создании сокета в функции «listenOn», затем я написал «listenOn2». И проблема решена. Вот полный код: (единственная разница заключается в изменении прото с [[getProtocolNumber "tcp"]] на [[defaultProtocol]]), возможно, это ошибка.

import IO 
import Control.Exception hiding (catch) 
import Control.Concurrent 
import Network 
import Network.Socket 
listenOn2 (PortNumber port) = do 
     --proto <- getProtocolNumber "tcp" ,here is the difference!!!! 
     let proto = defaultProtocol 
     bracketOnError 
      (socket AF_INET Stream proto) 
      (sClose) 
      (\sock -> do 
       setSocketOption sock ReuseAddr 1 
       --addr <- inet_addr "127.0.0.1" 
       bindSocket sock (SockAddrInet port iNADDR_ANY) 
       listen sock maxListenQueue 
       return sock 
      ) 
main = withSocketsDo $ do {main'} 
main' = listenOn2 (PortNumber 9900) >>= acceptConnections 

acceptConnections sock = do 
     putStrLn $ "trying to accept" ++ (show sock)-- debug msg 
     [email protected](h,host,port) <- Network.accept sock 
     print conn -- debug msg 
     forkIO $ catch (talk conn `finally` hClose h) (\e -> print e) 
     acceptConnections sock 

talk [email protected](h,_,_) = hGetLine h >>= hPutStrLn h >> hFlush h >> talk conn 
Смежные вопросы