Hi there,

socket Handles are unbuffered by the default, so 
if you change the buffering by inserting 

  hSetBuffering handle
                (BlockBuffered Nothing) -- or some such

after each call to socketToHandle / Socket.accept, you
should get a boost in throughput.

readSocket/writeSocket doesn't quite work with WinSock;
the files net/cbits/{read,write}Descriptor.c needs to 
perform similar CPP tricks that std/cbits/{read,write}File.c
does, i.e., WinSock requires you to use send() & recv()
instead of read() & write().

You shouldn't have to use readSocket/writeSocket here though.

--sigbjorn 

> -----Original Message-----
> From: Martijn [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, October 31, 2000 10:09
> To: Sigbjorn Finne
> Subject: RE: Socket.hs problem under Windows 2000
> 
> 
> Hi Sigbjorn,
> 
> I'm sorry to bother you again, but in my eyes you're the 
> socket Guru, so if 
> anyone can help me, it must be you :-)
> 
> I'm still struggling with my sockets here (I find myself calling them 
> suck-its nowadays). I managed to create a socket connection 
> between a C and 
> a Haskell program, and all communication works, but is a lot 
> slower than I 
> expected. Socket communication in compiled GHC programs is 
> even slower than 
> in interpreted Hugs Programs (using a simple Lambada socket 
> library I made.)
> 
> I also tried to use readSocket from SocketPrim instead 
> hPutStr etc. but I 
> can't get this to work at all. writeSocket always gives an 
> "internal error 
> (EBADF)(error code: 8)" and read socket never gets any data, 
> even when the 
> other side uses handles and works.
> 
> The following two programs show the problem. The way they are 
> now, they 
> work but are slow, but if I use the now commented 
> read/writeSocket calls 
> instead, nothing works:
> 
> Begin: Server.hs -----------------------
> module Main where
> 
> import IO
> import qualified Socket
> import SocketPrim
> import BSD
> 
> main =  withSocketsDo $
>   do { hSetBuffering stdout NoBuffering
>      ; putStrLn "Server: start listening"
>      ; serversocket <- Socket.listenOn (Socket.PortNumber 2222)
>      ; putStrLn "Start accepting"
> 
>      ; ~(sock', (SockAddrInet port haddr)) <- SocketPrim.accept 
> serversocket  -- taken from GHC lib Socket.lhs
>      ;  (HostEntry peername _ _ _)             <- 
> getHostByAddr AF_INET haddr
>      ; handle                              <- socketToHandle sock' 
> ReadWriteMode
> 
>      ; putStrLn ("Got connection from "++peername)
>      ; let sendstr = (replicate 4000 'x')++['\n']
>      ; putStrLn ("Start sending "++ show (length sendstr))
> 
> 
>      ; loop
>         (do { putStr "."
>             ; hPutStr handle sendstr              -- works, 
> but is slow
>            -- ; writeSocket sock' sendstr         -- doesn't work
>             ; return ()
>             })
>      }
> 
> loop :: IO () -> IO ()
> loop act = loop' where loop' = do { act; loop' }
> ----------------------------------------------
> and
> 
> Begin: Client.hs ------------------------
> module Main where
> 
> import IO
> import qualified Socket
> import SocketPrim
> import BSD
> 
> main = withSocketsDo $
>   do { hSetBuffering stdout NoBuffering
>      ; putStrLn "Client: start connecting"
> 
>      ; proto     <- getProtocolNumber "tcp"  -- taken from 
> GHC lib Socket.lhs
>      ; sock      <- socket AF_INET Stream proto
>      ; he        <- getHostByName "localhost"
>      ; connect sock (SockAddrInet 2222 (hostAddress he))
> 
>      ; handle <- socketToHandle sock ReadWriteMode
> 
>      ; putStrLn "Connected"
> 
>      ; loop
>         (do {
>              str <- hGetLine handle    -- works, but is slow
>         --   str <- readSocketAll sock -- doesn't work
>            ; if length str > 0 then putStr (show (length 
> str)) else return ()
>             })
>      }
> 
> loop :: IO () -> IO ()
> loop act = loop' where loop' = do { act; loop' }
> ----------------------------------------------
> 
> 
> Does any of this sound familiar to you?
> 
> Thanks.
> 
> Doeidoei,
> Martijn
> 

_______________________________________________
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to