Hi Haskell Cafe,<div><br></div><div>I&#39;ve written an echo server using just sockets:</div><div><br></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Concurrent</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Exception</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Monad</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Network</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Offsync.Data</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import System.IO</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import System.IO.Error (isEOFError)</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">main = withSocketsDo $ do</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  sListen &lt;- listenOn (PortNumber 8000)</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  putStrLn &quot;Listening on Port 8000&quot;</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  forkIO $ forever $ do</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    (sSession, hostname, port) &lt;- accept sListen</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    putStrLn (&quot;Connected to &quot; ++ hostname ++ &quot;:&quot; ++ show port)</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    forkIO $ echoLines sSession</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  putStrLn &quot;Press &lt;CTRL-D&gt; to quit.&quot;</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  exitOnCtrlD</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">echoLines h = try (hGetLine h) &gt;&gt;= either</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (\e -&gt; do { hClose h; if isEOFError e then print e else ioError e})</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (\l -&gt; do { hPutStrLn h l; hFlush h; echoLines h})</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">exitOnCtrlD = try getLine &gt;&gt;= either</font></div>
</div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (\e -&gt; unless (isEOFError e) $ ioError e)</font></div></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (const exitOnCtrlD)</font></div>
</div></blockquote><div><br></div><div>When I send text to it, it will echo it back immediately after my newline.</div><div><br></div><div>I then modified it to user IterIO:</div><div><br></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Concurrent</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Exception</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Monad</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Control.Monad.Trans</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Data.IterIO</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Data.IterIO.Inum</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import Network</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import System.IO</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import System.IO.Error (isEOFError)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">import qualified Data.ByteString.Lazy as L</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">iterHandle&#39; :: (MonadIO m) =&gt; Handle -&gt; IO (Iter L.ByteString m (), Onum L.ByteString m a)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">iterHandle&#39; = iterHandle</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">main = withSocketsDo $ do</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  sListen &lt;- listenOn (PortNumber 8000)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  putStrLn &quot;Listening on Port 8000&quot;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  forkIO $ forever $ do</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    (sSession, hostname, port) &lt;- accept sListen</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    putStrLn (&quot;Connected to &quot; ++ hostname ++ &quot;:&quot; ++ show port)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    forkIO $ do</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      (iter, enum) &lt;- iterHandle&#39; sSession</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      enum |$ iter</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      return ()</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  putStrLn &quot;Press &lt;CTRL-D&gt; to quit.&quot;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  exitOnCtrlD</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">exitOnCtrlD = try getLine &gt;&gt;= either</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (\e -&gt; unless (isEOFError e) $ ioError e)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (const exitOnCtrlD)</font></div>
</div></blockquote><div><br></div><div>It works, however it doesn&#39;t send anything back to me until end of file.</div><div><br></div><div>I fixed that problem with my sockets version by flushing after each line, but I don&#39;t know if IterIO will let me flush on every newline.</div>
<div><br></div><div>Any ideas?</div><div><br></div><div>Cheers,</div><div><br></div><div>-John</div><div><br></div>