0

我用相同的代码问了一个关于 windows 上的信号的问题,这是另一个问题

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
        conn@(h,host,port) <- accept sock
        print conn -- debug msg
        forkIO $ catch (talk conn `finally` hClose h) (\e -> print e)
        acceptConnections sock

talk conn@(h,_,_) = hGetLine h >>= hPutStrLn h >> hFlush h >> talk conn

我在win7上运行程序,看起来socket创建成功了,但是我不能telnet,而且netstat没有显示任何正在监听的socket,有什么问题吗?或者,haskell在windows上有bug? (顺便说一句,使用此代码在 debian 上完美运行)

4

1 回答 1

1

当我在win7上使用netstat -a时,我发现端口9900的监听IP是[::],既不是127.0.0.1也不是0.0.0.0,所以我猜问题是在函数“listenOn”中创建套接字时,然后我写了“listenOn2”替换。问题解决了。这是完整的代码:(唯一的区别是将 proto 从 [[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
        conn@(h,host,port) <- Network.accept sock
        print conn -- debug msg
        forkIO $ catch (talk conn `finally` hClose h) (\e -> print e)
        acceptConnections sock

talk conn@(h,_,_) = hGetLine h >>= hPutStrLn h >> hFlush h >> talk conn
于 2012-04-27T15:55:23.830 回答