Here is the Felix binding for ZeroMQ (3.1)

http://felix-lang.org/lib/std/io/zmq.flx

This is work-in-progress of course! Note that the language facilities
are used to make a fairly safe code, compared to the C interface.
The type system is leveraged so that all the options, etc, have their
own types and can only be used where they're appropriate.

The nastiest bit -- handling the socket options, requires quite a bit
of code to map the ugly C representation into a variant type.
A good project: I found a bug in the compiler doing it, and I'm going
to add some grammar so all the "const" of one type can be declared
at once.

Below is the Felix code for hello world, from the Guide.
It looks a lot like the C version I hope.

The "maybe_exit" procedure you see checks the zmq function
return codes and exits on error. Something like this cannot be
avoided in Felix: the return value of a function cannot be silently ignored.

To run, using statically linked executables (on unix like box with bash):

flx --static -c hwserver
flx --static -c hwclient
hwserver & hwclient &

///////////// hwserver.flx //////////////////////////////////
// Hello World server
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"

include "std/posix/errno";

open ZeroMQ;
println "hwserver, Felix version";

var context = zmq_init (1);

// Socket to talk to clients
var responder = zmq_socket (context, ZMQ_REP);
maybe_exit$ zmq_bind (responder, "tcp://*:5555");

while true do 
   // Wait for next request from client
   var request = #zmq_msg_t;
   maybe_exit$ zmq_recvmsg (responder, request, ZMQ_XMIT_OPTIONS_NONE);
   print ("Received Hello\n");

   // Do some 'work'
   Faio::sleep (sys_clock,1.0);

   // Send reply back to client
   var reply = zmq_msg_t 5.size;
   memcpy (zmq_msg_data (reply), c"World".address, 5.size);
   maybe_exit$ zmq_sendmsg (responder, reply, ZMQ_XMIT_OPTIONS_NONE);
done


/////////// hwclient.flx //////////////////////////////
// Hello World client
// Connects REQ socket to tcp://localhost:5555
// Sends "Hello" to server, expects "World" back

include "std/posix/errno";

open ZeroMQ;
println "hwclient, Felix version";

var context = zmq_init (1);

// Socket to talk to server
print ("Connecting to hello world server…\n");
var requester = zmq_socket (context, ZMQ_REQ);
maybe_exit$ zmq_connect (requester, "tcp://localhost:5555");

for var request_nbr in 0 upto 9 do
   var request = zmq_msg_t 5.size;
   memcpy (zmq_msg_data request, c"Hello".address, 5.size);
   print$ f"Sending Hello %d…\n" request_nbr;
   maybe_exit$ zmq_sendmsg (requester, request, ZMQ_XMIT_OPTIONS_NONE);

  var reply = #zmq_msg_t;
  maybe_exit$ zmq_recvmsg (requester, reply, ZMQ_XMIT_OPTIONS_NONE);
  print$ f"Received World %d\n" request_nbr;
done
maybe_exit$ zmq_term context;
////////////////////////////////////////

--
john skaller
skal...@users.sourceforge.net



------------------------------------------------------------------------------
RSA(R) Conference 2012
Mar 27 - Feb 2
Save $400 by Jan. 27
Register now!
http://p.sf.net/sfu/rsa-sfdev2dev2
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to