[zeromq-dev] ipc yet again

Martin Sustrik sustrik at 250bpm.com
Thu Jan 7 08:47:25 CET 2010


Hi Jon,

> been off the zmq loop for a day or so
> 
>> In any case I would suggest following the path discussed before: Open a
>> TCP connection, pass a unix domain socket from connecting app to binding
>> app (in form of a generated filename, INET domain sockets are not
>> capable of passing raw sockets AFAIK). Close the TCP socket, use the
>> pipe instead.
> 
> so following erik's suggestion we use AF_LOCAL socket rather than pipe.

Actually, if using AF_LOCAL, the task turns out to be extremely simple. 
Just open AF_LOCAL listening socket in zmq_listener_t and AF_LOCAL 
connecting socket in zmq_connecter_t. The api of both classes can be 
modified as follows:

-        int set_address (const char *addr_);
+        int set_address (const char *transport_, const char *addr_);

That way you can either open a tcp connection:

set_address ("tcp", "192.168.0.111:5555");

or an IPC connection:

set_address ("ipc", "/myfile");

Further, connect and bind functions in socket_base_t should be modified 
to accept ipc as well as tcp connections:

- if (addr_type == "tcp") {
+ if (addr_type == "tcp" || addr_type == "ipc") {

Obviously, it won't work on Windows so something like this is needed:

#if defined ZMQ_HAVE_WINDOWS
     return ENOTSUP;
#else
...

> 
> Then the sequence is approximately
> 
> 1) server starts up and binds a special address which  is actually on 
> localhost:XXXX
> eg
> zmq::socket_t s(ctx, ZMQ_REP);
> s.bind("?????") ; // this actually listens on 127.0.0.1:7777 for example
> 
> how is the port set up determined?
> what is the convention for the ?????

With AF_UNIX sockets there's no need for port number, the address maps 
to a filename:

s.bind ("ipc:///tmp/myfile");

> 
> when a client connects it sends a message which is the path of a UNIX domain 
> socket
> 
> 2) client connections
> 
> 	zmq::socket_t s(ctx, ZMQ_REQ);
> 	s.connect("????"); // a UNIX domain socket is opened, it's path passed as 
> part of the connection protocol. the server opens it's end of the socket, 
> closes tcp loopback and voila.

No need to pass sockets when using AF_LOCAL, no need to close and reopen 
the connection. Everything seems to be much simpler that way.

> should the filename, rather than be generated be set as a socket option?

No need to generate unique names either.

> I may be able to find a bit of spare time, so I could look into this with some 
> assistance.
> 
> where is best to start?

Check zmq_listener_t, zmq_connecter_t and socket_base_t as mentioned 
above. With AF_LOCAL sockets it seems that it won't take more than 2-3 
hours to implement the feature.

Martin



More information about the zeromq-dev mailing list