
Hi Haskell Cafe, I'm trying to send stuff over UDP. To do that, I've written a test program that sends strings across. That was fine, but I wanted to send binary data too. So I tried that only to find I am having difficulty putting together some binary data. For examples take the fromHex function in the following code. It is supposed to convert from a Hexadecimal string to a list of bytes, but I am having trouble coercing the integer types to the size I want. Is this the right way to do it? Cheers, -John
import Data.Bits import Data.Char import Data.Word import System.Environment import XStream.Tsmr.Client
data CmdLineOptions = CmdLineOptions { optionHelp :: Bool , optionVersion :: Bool , optionPort :: String , optionMessage :: String , optionInvalids :: [String] } deriving (Eq, Show)
initCmdLineOptions = CmdLineOptions { optionHelp = False , optionVersion = False , optionPort = "1234" , optionMessage = "" }
parseArgs :: [String] -> CmdLineOptions parseArgs [] = initCmdLineOptions parseArgs ("--port":port:xs) = (parseArgs xs) { optionPort = port } parseArgs ("--help":xs) = (parseArgs xs) { optionHelp = True } parseArgs ("--version":xs) = (parseArgs xs) { optionVersion = True } parseArgs (('-':opt):xs) = let option = (parseArgs xs) in option { optionInvalids = ('-':opt):optionInvalids option } parseArgs (message:xs) = (parseArgs xs) { optionMessage = message }
printUsage = do putStrLn "Usage: udp-server.lhs [options] <message>" putStrLn "" putStrLn "Options:" putStrLn " --help Get help information." putStrLn " --vesion Get version information." putStrLn " --port n The port number to listen on." putStrLn "" putStrLn "Message:" putStrLn " The message to send." putStrLn ""
printVersion = do putStrLn "Version."
fromHex :: String -> [Word8] fromHex [] = [] fromHex (u:l:xs) = (hexU .|. hexL):fromHex xs where hexU = (fromInteger $ hexValue u) :: Word8 hexL = (fromInteger $ hexValue l) :: Int hexValue c | '0' <= c && c <= '9' = ord c - ord '0' | 'a' <= c && c <= 'z' = ord c - ord 'a' + 10
run port message = do h <- openlog "localhost" port "udp-client.lhs" syslog h (fromHex message)
main = do args <- getArgs let options = parseArgs args let port = optionPort options let message = optionMessage options if optionHelp options then printUsage else if optionVersion options then printVersion else do putStrLn ("Starting UDP listener on port: " ++ port) run port message

Look at Data.Binary (binary package) It will marshall and unmarshall data types for you. If you don't like its binary encoding you can dive in there and use the same principles Cheers Neil On 6 Jun 2009, at 07:13, John Ky wrote:
Hi Haskell Cafe,
I'm trying to send stuff over UDP. To do that, I've written a test program that sends strings across. That was fine, but I wanted to send binary data too. So I tried that only to find I am having difficulty putting together some binary data. For examples take the fromHex function in the following code. It is supposed to convert from a Hexadecimal string to a list of bytes, but I am having trouble coercing the integer types to the size I want.
Is this the right way to do it?
Cheers,
-John
import Data.Bits import Data.Char import Data.Word import System.Environment import XStream.Tsmr.Client
data CmdLineOptions = CmdLineOptions { optionHelp :: Bool , optionVersion :: Bool , optionPort :: String , optionMessage :: String , optionInvalids :: [String] } deriving (Eq, Show)
initCmdLineOptions = CmdLineOptions { optionHelp = False , optionVersion = False , optionPort = "1234" , optionMessage = "" }
parseArgs :: [String] -> CmdLineOptions parseArgs [] = initCmdLineOptions parseArgs ("--port":port:xs) = (parseArgs xs) { optionPort = port } parseArgs ("--help":xs) = (parseArgs xs) { optionHelp = True } parseArgs ("--version":xs) = (parseArgs xs) { optionVersion = True } parseArgs (('-':opt):xs) = let option = (parseArgs xs) in option { optionInvalids = ('-':opt):optionInvalids option } parseArgs (message:xs) = (parseArgs xs) { optionMessage = message }
printUsage = do putStrLn "Usage: udp-server.lhs [options] <message>" putStrLn "" putStrLn "Options:" putStrLn " --help Get help information." putStrLn " --vesion Get version information." putStrLn " --port n The port number to listen on." putStrLn "" putStrLn "Message:" putStrLn " The message to send." putStrLn ""
printVersion = do putStrLn "Version."
fromHex :: String -> [Word8] fromHex [] = [] fromHex (u:l:xs) = (hexU .|. hexL):fromHex xs where hexU = (fromInteger $ hexValue u) :: Word8 hexL = (fromInteger $ hexValue l) :: Int hexValue c | '0' <= c && c <= '9' = ord c - ord '0' | 'a' <= c && c <= 'z' = ord c - ord 'a' + 10
run port message = do h <- openlog "localhost" port "udp-client.lhs" syslog h (fromHex message)
main = do args <- getArgs let options = parseArgs args let port = optionPort options let message = optionMessage options if optionHelp options then printUsage else if optionVersion options then printVersion else do putStrLn ("Starting UDP listener on port: " ++ port) run port message
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (2)
-
John Ky
-
Neil Davies