A purely functional TCP implementation

Latest on Hackage:0.0.2

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow to host generated Haddocks.

BSD3 licensed by Peng Li and Stephan Zdancewic
Maintained by Don Stewart
* Linux 2.6.x
* GHC 6.5
* libaio --- the Linux Asynchonrous I/O Library.
* libipq --- the iptables development library (iptables-dev in Debian)

If you wish to try the web server, make sure that the HTML files are
on one of these file systems: ext2, ext3, jfs, xfs. Otherwise, AIO
may not work.

Files and directories:
IOLib/ : Low-level asynchronous I/O library
Chunk.hs : A type-safe representation of memory buffers
AIO.hs : FFI wrappers for the Linux AIO library
Epoll.hs : FFI wrappers for the Linux epoll interface
NBIO.hs : FFI wrappers for some non-blocking socket primitives
PacketIO.hs : FFI wrappers for sending/receiving IP packets.
TCP.hs : A proof-of-concept, purely functional TCP stack.

ThreadLib/ : The application-level thread library
Thread.hs : CPS Monad and system calls.
Workers.hs : Some standard and reusable event loops for constructing
application-level schedulers.
A default scheduler implementation is also provided.
FileIO.hs : Synchronous disk library, implemented using Linux AIO
SockIO.hs : Synchronous socket library, implemented using standard
non-blocking sockets with epoll.
TCPSockIO.hs : Synchronous socket library, implemented using the
user-level, customized TCP stack.
Mutex.hs : A simple mutex library.

WebClient/ : An HTTP load generator application

WebServer/ : A web server application. It can be linked with
either SockIO or TCPSockIO.

Compile and run:
First, make sure that libaio is installed on your system and you are
using a development snapshot GHC 6.5. Then, run the shell script
"" to compile all the sources. This should create three
executable files:


Run them. They are self-documented. To use Server_tcp.bin, you should
first run "make setup" in the WebServer/ directory to setup iptables.
Read the Makefile for more information.

Programming with threads
Just use Server.hs and LoadGen.hs as templates to start.

Programming with events
The scheduler is part of your application. You can use some standard
event loops predefined in Workers.hs, or you can write your own.

Q: How to use another event source like *poll/*IO/kqueue/whatever?

A: First, wrap up the C function calls using FFI. AIO.hs and
mod_aio.c is a good demo to start with. Then, add system calls and
write your own event loops :-)

Q: How to add system calls?

A: The current setup is not quite modular yet---you will have to add a
line in Thread.hs for each system call you would like to add. In the
future, it is possible to make the Trace interface user-pluggable by
adding an extra level of indirection.

Q: How to write my own event loops?

A: As a demo, LoadGen.hs has a customized event loop. It does not do
anything fancy, though.

Q: How is the TCP stack?

A: The current implementation is purely functional and it is quite
slow. It is roughly 3x-8x slower than the linux kernel TCP stack.
It only implemented server sockets---active TCP connections are
not implemented yet.
Depends on:
Used by 1 package:
comments powered byDisqus