Well, I was needing to make some circular pipelines, so I whipped up a
pair of programs called "faucet" and "drain". Stuff would flow into
the drain at the end of the pipe, when it comes out of the faucet at
the beginning. Here's the drain program:

module Main where

import Network
import System.IO
import System.Environment(getArgs)

main = withSocketsDo $ do
         input <- getContents
         (args:_) <- getArgs
         let port = PortNumber (fromInteger (read args))
         sock <- listenOn port
         loop sock input
  where loop sock input = do (handle, hostname, _) <- accept sock
                             hSetBuffering handle NoBuffering
                             if hostname == "localhost"
                                then hLazyPutStr handle input
                                else return ()
                             hClose handle
                             loop sock input

hLazyPutStr handle = foldr (\x xs -> hPutChar handle x >> xs) (return ())

And the faucet (much simpler, no?):

module Main where

import Network
import System.IO
import System.Environment(getArgs)

main = withSocketsDo $ do
         (args:_) <- getArgs
         let port = PortNumber (fromInteger (read args))
         conn <- connectTo "localhost" port
         hGetContents conn >>= putStr

The problem: each drain only seems to support one faucet. You only
need multiple faucets if you want to branch off and stuff, but I like
my programs to be perfect :-) (By the way, the drain should send the
entirety of its input to every faucet, no matter when they connect.)

The other problem is that the faucet doesn't wait forever for a drain
to appear, but I'd like it to. How can I fix these problems?

--ihope
_______________________________________________
Haskell mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to