= raw

This is a simple asynchronous demo, that demonstrates use of the RAW
sockets with a server, along with async message handling, to obtain a
very high level of asynchronous operation, suitable for use in a highly
concurrent server application.

== Compiling

You can override the level of concurrency with the `PARALLEL` option.

This determines how many requests the server will accept
at a time, and keep outstanding.  Note that for our toy
implementation, we create this many "logical" flows of execution
(these are _NOT_ threads), where a request is followed by a reply.

The value of `PARALLEL` must be at least one, and may be as large
as your memory will permit.  (The default value is 32.)

The best way to build is using cmake and Ninja build:

[source, bash]
----
% mkdir build
% cd build
% cmake -G Ninja ..
% ninja
----

You can also build the hard way.  For example, on UNIX-style systems:

[source, bash]
----
% export CPPFLAGS="-D PARALLEL=32 -I /usr/local/include"
% export LDFLAGS="-L /usr/local/lib -lnng"
% export CC="cc"
% ${CC} ${CPPFLAGS} raw.c -o raw ${LDFLAGS}
----

== Running

To run the server, use the arguments `__url__ -s`.

To run the client, use the arguments `__url__ __msec__`.

The _msec_ is a "delay" time that server will wait before responding.
We have these delays so simulate long running work.

In the following example, all of the clients should complete within
2 seconds.  (Assuming `PARALLEL` is defined to be large enough.)

[source,bash]
----
% export URL="tcp://127.0.0.1:55995"
# start the server
% ./raw $URL -s &
# start a bunch of clients
# Note that these all run concurrently!
% ./raw $URL 2 &
% ./raw $URL 2 &
% ./raw $URL 2 &
% ./raw $URL 2 &
% ./raw $URL 2 &
----
