You don't use correct pattern for ZMQ_ROUTER/ZMQ_DEALER socket.
Pseudo code is
front = zmq_socket (context, ZMQ_ROUTER);
zmq_bind(front, "tcp://*:15555");
back = zmq_socket(context, ZMQ_DEALER);
zmq_bind (back, "inproc://abc");
// Here create thread
zmq_proxy(front, back, NULL); // zmq_proxy will not return
Pseudo code for thread is
socket = zmq_socket(context, ZMQ_REP);
zmq_connect(socket, "inproc://abc");
do {
zmq_recv(...)
zmq_send(...)
} while (1);
Pseudo code for client is
socket = zmq_socket(context, ZMQ_REQ);
zmq_connect(socket, "tcp://127.0.0.1:15555");
do {
zmq_send(...)
zmq_recv(...)
} while (1);