[Haskell-cafe] UDP client/server

Gregory Wright gwright at comcast.net
Thu Jan 11 10:35:49 EST 2007


Hi John,

On Jan 11, 2007, at 1:58 AM, John Ky wrote:

> Hello,
>
> Does anyone know where I can find a simple UDP client/server  
> written in Haskell?
>
> Something along the lines of an echo server would do.
>
> Thanks
>
> -John
>

Try:

--
-- UDPEchoServer.hs: Exactly what the name says, a datagram echo server.
--


module Main (main) where

import Network.Socket
import System.Posix.Directory
import System.Posix.Files
import System.Posix.IO
import System.Posix.Process
import System.Exit


echoPort = 9900
maxline = 1500

--
-- The daemon infrastructure
--

main :: IO ()
main = do
           pid <- forkProcess child
           exitImmediately ExitSuccess


child :: IO ()
child = do
           -- Set up the working directory, mask and standard i/o
           -- for a daemon process (these will be inherited by
           -- the forked process):

           changeWorkingDirectory "/"
           setFileCreationMask 0

           mapM_ closeFd [stdInput, stdOutput, stdError]
           nullFd <- openFd "/dev/null" ReadWrite Nothing  
defaultFileFlags
           mapM_ (dupTo nullFd) [stdInput, stdOutput, stdError]

           closeFd nullFd

           createSession     -- This child becomes a process and session
                             -- group leader. This prevents the child of
                             -- this process (the daemon) from
                             -- ever getting a controlling terminal.
           pid' <- forkProcess echoserver

           exitImmediately ExitSuccess

--
-- The echo server daemon
--

echoserver :: IO ()
echoserver = do
           withSocketsDo $ do
                   sock <- socket AF_INET Datagram 0
                   bindSocket sock (SockAddrInet echoPort iNADDR_ANY)
                   socketEcho sock


socketEcho :: Socket -> IO ()
socketEcho sock = do
           (mesg, recv_count, client) <- recvFrom sock maxline
           send_count <- sendTo sock mesg client
           socketEcho sock



------------------------------------------------------------------------ 
-------------------------------


On my OS X/ppc 10.4.8 system, the above builds with ghc 6.6 and if I  
open one
terminal with

gregory-wrights-powerbook-g4-17> nc -u 127.0.0.1 9900

and another with

gregory-wrights-powerbook-g4-17> nc -ul -p 9900 127.0.0.1

whatever I type into the first terminal appears on the second.  You  
may have to
consult your documentation for the options to your version of nc (or  
netcat,
if you use that instead).

I was also able to see that the server returned packets using hping3.

Needless to say, the above is just an example, and is by no means  
bulletproof.
I think I adapted it from something I found on the old wiki and  
updated it
to work with the current libraries.

Best Wishes,
Greg




  


More information about the Haskell-Cafe mailing list