Network problem with ghc on WinXP

Simon Marlow simonmar at microsoft.com
Thu Jan 29 11:33:24 EST 2004


Is there a reason not to export PortNumber abstractly?  I can't think of
one off-hand.

Cheers,
	Simon 

> -----Original Message-----
> From: glasgow-haskell-users-bounces at haskell.org 
> [mailto:glasgow-haskell-users-bounces at haskell.org] On Behalf 
> Of Sigbjorn Finne
> Sent: 29 January 2004 06:37
> To: robin abraham
> Cc: glasgow-haskell-users at haskell.org
> Subject: Re: Network problem with ghc on WinXP
> 
> Hi there,
> 
> looks like a network byte-order vs host byte-order gotcha.
> Never use the PortNum constructor, but declare 'portnum'
> to have type PortNumber and simply drop the use of PortNum
> in your code alltogether. Alternatively, use intToPortNumber
> to translate between Int and PortNumber.
> 
> hth
> --sigbjorn
> 
> ----- Original Message ----- 
> From: "robin abraham" <abraharo at cs.orst.edu>
> To: <glasgow-haskell-users at haskell.org>
> Sent: Wednesday, January 28, 2004 21:57
> Subject: Network problem with ghc on WinXP
> 
> 
> > Hi,
> >
> > I have ghc-6.0.1 on WinXP and Solaris. I have a simple echo server
> (server.hs
> > given below) and client (client.hs given below) and I encounter the
> following:
> > 1) server.hs compiled and running on Solaris:
> >    a) client.hs (Solaris) can connect.
> >    b) client.hs (WinXP) cannot connect.
> >    c) telnet (WinXP) can connect.
> >    d) telnet (Solaris) can connect.
> >    e) Scan of port 3000 shows server is listening.
> >
> > 2) server.hs compiled and running on WinXP:
> >    a) client.hs (Solaris) cannot connect.
> >    b) client.hs (WinXP) can connect.
> >    c) telnet (WinXP) cannot connect.
> >    d) telnet (Solaris) cannot connect.
> >    e) Scan of ports does not show server.
> >
> > Basically, when the server is running on WinXP, only the 
> Haskell program
> > client.hs (also running on the same WinXP machine) can 
> "converse" with it
> > through the socket connection. To verify this, I wrote a 
> client in C# -
> from the
> > WinXP machine, it can connect to server running on my 
> Solaris machine but
> not to
> > server on the same WinXP machine.
> >
> > Why isn't the server program on WinXP not behaving itself? Any
> help/guidance
> > would be highly appreciated.
> >
> > Thank you.
> > Robin.
> >
> > -- server.hs
> > module Main where
> >
> > import SocketPrim
> > import Concurrent
> > import System (getArgs,exitFailure)
> > import Exception(finally)
> > import MVar
> > import IO
> >
> > server_sock :: IO (Socket)
> > server_sock = do
> >     s <- socket AF_INET Stream 6
> >     setSocketOption s ReuseAddr 1
> >     bindSocket s (SockAddrInet (PortNum portnum) iNADDR_ANY)
> >     listen s 2
> >     return s
> >
> > echo_server :: Socket -> IO ()
> > echo_server s = do
> >     (s', clientAddr) <- accept s
> >     h <- socketToHandle s' ReadWriteMode
> >     proc <- read_data s' 0
> >     putStrLn ("server processed "++(show proc)++" bytes")
> >     sClose s'
> >     where
> >         read_data sock totalbytes = do
> >             str <- recv sock 18
> >             putStrLn ("Server recv: " ++ str)
> >             if ((length str) >= 18)
> >                 then do
> >                     putStrLn ("Server read: " ++ str)
> >                     writ <- send sock str
> >                     putStrLn ("Server wrote: " ++ str)
> >                     read_data sock $! (totalbytes+(length $! str))
> >                 else do
> >                     putStrLn ("server read: " ++ str)
> >                     return totalbytes
> >
> > message     = "Hello there sailor"
> > portnum     = 3000
> >
> > main = withSocketsDo $ do {
> >     ~[n] <- getArgs;
> >     ssock <- server_sock;
> >     s <- myForkIO (echo_server ssock);
> >     join s;
> >     putStrLn "join s";
> >     }
> >
> > myForkIO :: IO () -> IO (MVar ())
> > myForkIO io = do
> >     mvar <- newEmptyMVar
> >     forkIO (io `finally` putMVar mvar ())
> >     return mvar
> >
> > join :: MVar () -> IO ()
> > join mvar = readMVar mvar
> >
> > -- end of server.hs
> >
> > -- ***********************************************
> >
> > -- client.hs
> >
> > module Main where
> >
> > import SocketPrim
> > import Concurrent
> > import System (getArgs,exitFailure)
> > import Exception(finally)
> > import MVar
> > import IO
> >
> > local       = "128.193.39.108"
> > message     = "Hello there sailor"
> > portnum     = 3000
> >
> > client_sock = do
> >     s <- socket AF_INET Stream 6
> >     ia <- inet_addr local
> >     connect s (SockAddrInet (PortNum portnum) ia)
> >     return s
> >
> > echo_client n = do
> >     s <- client_sock
> >     drop <- server_echo s n
> >     sClose s
> >     where
> >         server_echo sock n = if n > 0
> >             then do
> >                 send sock message
> >                 putStrLn ("Client wrote: " ++ message)
> >                 str <- recv sock 19
> >                 if (str /= message)
> >                     then do
> >                         putStrLn ("Client read error: " ++ str)
> >                         exitFailure
> >                     else do
> >                         putStrLn ("Client read success")
> >                         server_echo sock (n-1)
> >             else do
> >                 putStrLn "Client read nil"
> >                 return []
> >
> > main = withSocketsDo $ do
> >     ~[n] <- getArgs
> >     c <- myForkIO (echo_client (read n::Int))
> >     join c
> >     putStrLn "join c"
> >
> > myForkIO :: IO () -> IO (MVar ())
> > myForkIO io = do
> >     mvar <- newEmptyMVar
> >     forkIO (io `finally` putMVar mvar ())
> >     return mvar
> >
> > join :: MVar () -> IO ()
> > join mvar = readMVar mvar
> >
> > -- end of client.hs
> >
> 
> _______________________________________________
> Glasgow-haskell-users mailing list
> Glasgow-haskell-users at haskell.org
> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
> 


More information about the Glasgow-haskell-users mailing list