Есть два приложения, использующих zmq, на первом развернут zmq_router
void *context = zmq_ctx_new ();
mitm_socket = zmq_socket (context, ZMQ_ROUTER);
int rc = zmq_bind (mitm_socket, "tcp://*:5556");
....
zmq_send(mitm_socket,((struct osmocom_ms*)ms)->name,strlen(((struct osmocom_ms*)ms)->name)+1,ZMQ_SNDMORE);
if(zmq_send (mitm_socket, json_dumps(root,0), strlen(json_dumps(root,0))+ 1,ZMQ_NOBLOCK) == -1){
//zmq_close (requester);
//zmq_ctx_destroy (context);
vty_notify(ms,"Inside send\n");
return -2;
}
int ling_period_osmo=3000;
int recv_timeout_osmo=3000;
void *osmo_context = zmq_ctx_new ();
void *osmo_socket = zmq_socket (osmo_context, ZMQ_DEALER);
zmq_setsockopt (osmo_socket, ZMQ_IDENTITY,identity, sizeof(identity));
zmq_setsockopt (osmo_socket, ZMQ_LINGER, &ling_period_osmo, sizeof(int));
zmq_setsockopt (osmo_socket, ZMQ_RCVTIMEO, &recv_timeout_osmo, sizeof(int));
if(zmq_connect (osmo_socket, "tcp://localhost:5556") == -1){
printf("Couldn't connect to osmocom\n");
return NULL;
}
rc=receive_message_from_router(main_socket, &buffer);
printf("Thread %d: recv status from bts %d\n",*(int*)arg, rc);
if(rc < 0){
//printf("Waiting from osmo\n");
rc=receive_message_from_router(osmo_socket, &buffer);
f(rc >=0){
printf("Thread %d:Reseive from osmo ",*(int*)arg);
}
}
else
printf("Thread %d:Reseive from bts ",*(int*)arg);
......
int receive_message_from_router(void * responder,zmq_msg_t *buffer){
zmq_msg_t last;
zmq_msg_init (&last);
zmq_msg_t message;
zmq_msg_init (&message);
int result;
while(1){
result = zmq_msg_recv (&message, responder, 0);
if(result == -1)
return -1;
else
printf("Data from router \"%s\"\n",zmq_msg_data(&message));
int64_t more; // Multipart detection
more = 0;
size_t more_size = sizeof (more);
zmq_getsockopt (responder, ZMQ_RCVMORE, &more, &more_size);
if (!more){
zmq_msg_copy (&last, &message);
break;
}// Last message part
}
zmq_msg_copy (buffer, &last);
zmq_msg_close(&last);
zmq_msg_close (&message);
return 0;
}