[Haskell-cafe] Interpreting fields in a buffer
Alastair Reid
alastair at reid-consulting-uk.ltd.uk
Mon Jan 26 10:34:06 EST 2004
> I have a question related to a program I'm writing. I have to
> handle IP packets, which will be read into a buffer. What is the
> best haskell idiom for getting access to the fields in the buffer?
There's no way in Haskell to define a datastructure with a particular memory
layout. (Strictly, there's no way to do it in ANSI C either but it's easy
enough to work with what C gives you.)
To access the fields, you will need to write a bunch of functions to read them
out (and write them if you need). There's basically two approaches:
1) Write access functions in C and use the ffi interface to call them.
For example, you might have a function to read the TTL field given
a pointer to the IP header.
2) Write access functions in Haskell using functions from the Storable
class and associated libraries.
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Foreign.Storable.html
To do this, you need to know the offset (in bytes) of each field
of the data structure. hsc2hs is great for doing this kind of thing.
> Is there a way in haskell to declare the format of the header, then
> access the components of the buffer as elements of those types?
> I'm only going to do read access on the buffer (an unboxed array).
I would lean towards leaving the buffer over in C land instead of loading it
into a Haskell buffer. (Of course, it depends a bit on how much processing
of the packet you will be doing in Haskell.)
Hope this helps,
--
Alastair Reid www.haskell-consulting.com
More information about the Haskell-Cafe
mailing list