/* For testing ZeroMQ speed: push N empty messages over 0MQ to a pull * client, then wait for it to tell us to exit. See zmqpulln.c for * results. */ #include #include #include #include #include #define S(x) #x #define S_(x) S(x) #define LINE S_(__LINE__) #define req(x) do { if (!(x)) { perror(__FILE__ ":" LINE ": " #x); abort(); } } while (0) int main(int argc, char **argv) { int n = atoi(argv[1]); void *context = zmq_ctx_new(); req(context); void *quit_socket = zmq_socket(context, ZMQ_REP); req(quit_socket); req(0 == zmq_connect(quit_socket, "tcp://127.0.0.1:2821")); void *push_socket = zmq_socket(context, ZMQ_PUSH); req(push_socket); req(0 == zmq_bind(push_socket, "tcp://127.0.0.1:2822")); for (int i = 0; i != n; i++) { zmq_msg_t pushmsg; zmq_msg_init(&pushmsg); req(0 <= zmq_msg_send(&pushmsg, push_socket, 0)); req(0 == zmq_msg_close(&pushmsg)); } printf("Sent %d messages, awaiting response.\n", n); zmq_msg_t request; zmq_msg_init(&request); req(0 <= zmq_msg_recv(&request, quit_socket, 0)); printf("Got response: "); fwrite(zmq_msg_data(&request), zmq_msg_size(&request), 1, stdout); printf("\n"); req(0 == zmq_msg_close(&request)); char *msg = "Be at peace."; zmq_msg_t reply; req(0 == zmq_msg_init_size(&reply, strlen(msg))); memcpy(zmq_msg_data(&reply), msg, strlen(msg)); req(0 <= zmq_msg_send(&reply, quit_socket, 0)); req(0 == zmq_msg_close(&reply)); struct timespec ten_milliseconds = { 0, 10*1000*1000 }; nanosleep(&ten_milliseconds, NULL); // This hangs: req(0 == zmq_ctx_destroy(context)); return 0; }