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 でプログラムを実行すると、ソケットの作成は成功したように見えますが、telnet で接続できず、netstat はプロセスでリッスンしているソケットを表示しません。 (ちなみに、このコードを使用したdebianでは完璧に動作します)

4

1 に答える 1

1

win7でnetstat-aを使用すると、ポート9900のリスニングIPが[::]であり、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
        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 に答える