int main(int argc, char** argv) { void* context = zmq_ctx_new(); void* pubSocket; void* subSocket; (pubSocket = zmq_socket(context, ZMQ_XPUB)) || printf("zmq_socket: %s\n", zmq_strerror(errno)); (subSocket = zmq_socket(context, ZMQ_SUB)) || printf("zmq_socket: %s\n", zmq_strerror(errno)); zmq_setsockopt(subSocket, ZMQ_SUBSCRIBE, "foo", 3) && printf("zmq_setsockopt: %s\n",zmq_strerror(errno)); zmq_bind(pubSocket, "inproc://someInProcDescriptor") && printf("zmq_bind: %s\n", zmq_strerror(errno)); //zmq_bind(pubSocket, "tcp://*:30010") && printf("zmq_bind: %s\n", zmq_strerror(errno)); int32_t more; size_t more_size = sizeof(more); int iteration = 0; while(1) { zmq_pollitem_t items [] = { { subSocket, 0, ZMQ_POLLIN, 0 }, // read publications { pubSocket, 0, ZMQ_POLLIN, 0 }, // read subscriptions }; zmq_poll(items, 2, 500); if (items[1].revents & ZMQ_POLLIN) { while (1) { zmq_msg_t msg; zmq_msg_init (&msg); zmq_msg_recv (&msg, pubSocket, 0); int msgSize = zmq_msg_size(&msg); char* buffer = (char*)zmq_msg_data(&msg); if (buffer[0] == 0) { assert(isSubscribed); printf("unsubscribing from '%s'\n", strndup(buffer + 1, msgSize - 1)); isSubscribed = false; } else { assert(!isSubscribed); printf("subscribing on '%s'\n", strndup(buffer + 1, msgSize - 1)); isSubscribed = true; } zmq_getsockopt (pubSocket, ZMQ_RCVMORE, &more, &more_size); zmq_msg_close (&msg); if (!more) break; // Last message part } } if (items[0].revents & ZMQ_POLLIN) { while (1) { zmq_msg_t msg; zmq_msg_init (&msg); zmq_msg_recv (&msg, subSocket, 0); int msgSize = zmq_msg_size(&msg); char* buffer = (char*)zmq_msg_data(&msg); printf("received on subscriber '%s'\n", strndup(buffer, msgSize)); zmq_getsockopt (subSocket, ZMQ_RCVMORE, &more, &more_size); zmq_msg_close (&msg); if (!more) { publicationsReceived++; break; // Last message part } } } if (iteration == 1) { zmq_connect(subSocket, "inproc://someInProcDescriptor") && printf("zmq_connect: %s\n", zmq_strerror(errno)); //zmq_connect(subSocket, "tcp://127.0.0.1:30010") && printf("zmq_connect: %s\n", zmq_strerror(errno)); } if (iteration == 4) { zmq_disconnect(subSocket, "inproc://someInProcDescriptor") && printf("zmq_disconnect(%d): %s\n", errno, zmq_strerror(errno)); //zmq_disconnect(subSocket, "tcp://127.0.0.1:30010") && printf("zmq_disconnect: %s\n", zmq_strerror(errno)); } if (iteration == 10) { break; } zmq_msg_t channelEnvlp; ZMQ_PREPARE_STRING(channelEnvlp, "foo", 3); zmq_sendmsg(pubSocket, &channelEnvlp, ZMQ_SNDMORE) >= 0 || printf("zmq_sendmsg: %s\n",zmq_strerror(errno)); zmq_msg_close(&channelEnvlp) && printf("zmq_msg_close: %s\n",zmq_strerror(errno)); zmq_msg_t message; ZMQ_PREPARE_STRING(message, "this is foo!", 12); zmq_sendmsg(pubSocket, &message, 0) >= 0 || printf("zmq_sendmsg: %s\n",zmq_strerror(errno)); zmq_msg_close(&message) && printf("zmq_msg_close: %s\n",zmq_strerror(errno)); iteration++; } assert(publicationsReceived == 3); assert(!isSubscribed); zmq_close(pubSocket) && printf("zmq_close: %s", zmq_strerror(errno)); zmq_close(subSocket) && printf("zmq_close: %s", zmq_strerror(errno)); zmq_ctx_destroy(context); return 0; }
int main(int, char**) { setup_test_environment(); void* context = zmq_ctx_new(); void* pubSocket; void* subSocket; (pubSocket = zmq_socket(context, ZMQ_XPUB)) || printf("zmq_socket: %s\n", zmq_strerror(errno)); (subSocket = zmq_socket(context, ZMQ_SUB)) || printf("zmq_socket: %s\n", zmq_strerror(errno)); zmq_setsockopt(subSocket, ZMQ_SUBSCRIBE, "foo", 3) && printf("zmq_setsockopt: %s\n",zmq_strerror(errno)); zmq_bind(pubSocket, "inproc://someInProcDescriptor") && printf("zmq_bind: %s\n", zmq_strerror(errno)); //zmq_bind(pubSocket, "tcp://127.0.0.1:30010") && printf("zmq_bind: %s\n", zmq_strerror(errno)); int more; size_t more_size = sizeof(more); int iteration = 0; while (1) { zmq_pollitem_t items [] = { { subSocket, 0, ZMQ_POLLIN, 0 }, // read publications { pubSocket, 0, ZMQ_POLLIN, 0 }, // read subscriptions }; int rc = zmq_poll (items, 2, 100); if (items [1].revents & ZMQ_POLLIN) { while (1) { zmq_msg_t msg; zmq_msg_init (&msg); zmq_msg_recv (&msg, pubSocket, 0); char* buffer = (char*)zmq_msg_data(&msg); if (buffer[0] == 0) { assert(isSubscribed); isSubscribed = false; } else { assert(!isSubscribed); isSubscribed = true; } zmq_getsockopt (pubSocket, ZMQ_RCVMORE, &more, &more_size); zmq_msg_close (&msg); if (!more) break; // Last message part } } if (items[0].revents & ZMQ_POLLIN) { while (1) { zmq_msg_t msg; zmq_msg_init (&msg); zmq_msg_recv (&msg, subSocket, 0); zmq_getsockopt (subSocket, ZMQ_RCVMORE, &more, &more_size); zmq_msg_close (&msg); if (!more) { publicationsReceived++; break; // Last message part } } } if (iteration == 1) { zmq_connect(subSocket, "inproc://someInProcDescriptor") && printf("zmq_connect: %s\n", zmq_strerror(errno)); msleep (SETTLE_TIME); } if (iteration == 4) { zmq_disconnect(subSocket, "inproc://someInProcDescriptor") && printf("zmq_disconnect(%d): %s\n", errno, zmq_strerror(errno)); } if (iteration > 4 && rc == 0) break; zmq_msg_t channelEnvlp; ZMQ_PREPARE_STRING(channelEnvlp, "foo", 3); zmq_msg_send (&channelEnvlp, pubSocket, ZMQ_SNDMORE) >= 0 || printf("zmq_msg_send: %s\n",zmq_strerror(errno)); zmq_msg_close(&channelEnvlp) && printf("zmq_msg_close: %s\n",zmq_strerror(errno)); zmq_msg_t message; ZMQ_PREPARE_STRING(message, "this is foo!", 12); zmq_msg_send (&message, pubSocket, 0) >= 0 || printf("zmq_msg_send: %s\n",zmq_strerror(errno)); zmq_msg_close(&message) && printf("zmq_msg_close: %s\n",zmq_strerror(errno)); iteration++; } assert(publicationsReceived == 3); assert(!isSubscribed); zmq_close(pubSocket) && printf("zmq_close: %s", zmq_strerror(errno)); zmq_close(subSocket) && printf("zmq_close: %s", zmq_strerror(errno)); zmq_ctx_term(context); return 0; }
int main (int argc, char *argv []) { const char *bind_to; int roundtrip_count; size_t message_size; void *ctx; void *s; int rc; int i; zmq_msg_t msg; zmq_msg_t topic; if (argc != 4) { printf ("usage: %s <bind-to> <message-size> " "<roundtrip-count>\n", argv[0]); return 1; } bind_to = argv [1]; message_size = atoi (argv [2]); roundtrip_count = atoi (argv [3]); ctx = zmq_init (1); if (!ctx) { printf ("error in zmq_init: %s\n", zmq_strerror (errno)); return -1; } s = zmq_socket (ctx, ZMQ_XPUB); if (!s) { printf ("error in zmq_socket: %s\n", zmq_strerror (errno)); return -1; } char check_dropped_packets = 1; if(message_size < GetNumberOfDigits(roundtrip_count)) { printf("CAUTION: Message size too small to check for dropped packets\r\n"); check_dropped_packets = 0; } #ifdef ZMQ_PUB_RELIABLE // set PUB_RELIABLE int pub_reliable = 1; rc = zmq_setsockopt(s, ZMQ_PUB_RELIABLE, &pub_reliable, sizeof(pub_reliable)); if (rc != 0) { printf ("error in zmq_setsockopt (ZMQ_PUB_RELIABLE): %s\n", zmq_strerror (errno)); return -1; } #endif // set infinity HWM int hwm = 1000; rc = zmq_setsockopt(s, ZMQ_SNDHWM, &hwm , sizeof(hwm)); if (rc != 0) { printf ("error in zmq_setsockopt (ZMQ_SNDHWM): %s\n", zmq_strerror (errno)); return -1; } // get HWM size_t hwmlen = sizeof(hwm); rc = zmq_getsockopt(s, ZMQ_SNDHWM, &hwm , &hwmlen); if (rc != 0) { printf ("error in zmq_getsockopt (ZMQ_SNDHWM): %s\n", zmq_strerror (errno)); return -1; } printf("HWM=%d\r\n", hwm); rc = zmq_bind (s, bind_to); if (rc != 0) { printf ("error in zmq_bind: %s\n", zmq_strerror (errno)); return -1; } rc = zmq_msg_init (&msg); if (rc != 0) { printf ("error in zmq_msg_init: %s\n", zmq_strerror (errno)); return -1; } printf("Waiting for subscriber.\r\n"); rc = zmq_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in zmq_recvmsg: %s\n", zmq_strerror (errno)); return -1; } printf("Subscriber detected!\n"); rc = zmq_msg_close (&msg); if (rc != 0) { printf ("error in zmq_msg_close: %s\n", zmq_strerror (errno)); return -1; } for (i = 0; i != roundtrip_count; i++) { //PREPARE MSGS ZMQ_PREPARE_STRING(topic, "TEST", 4); void* buffer = malloc(message_size); memset (buffer, 0, message_size); if(check_dropped_packets) { sprintf(buffer, "%d", i); } rc = zmq_msg_init_data (&msg, buffer, message_size, my_free, NULL); if (rc != 0) { printf ("error in zmq_msg_init_data: %s\n", zmq_strerror (errno)); return -1; } rc = zmq_msg_send (&topic, s, ZMQ_SNDMORE); if (rc < 0) { printf ("error in zmq_sendmsg: %s\n", zmq_strerror (errno)); return -1; } rc = zmq_msg_send (&msg, s, 0); if (rc < 0) { printf ("error in zmq_sendmsg: %s\n", zmq_strerror (errno)); return -1; } //printf("SENT %d\n",i); } rc = zmq_msg_close (&topic); if (rc != 0) { printf ("error in zmq_msg_close: %s\n", zmq_strerror (errno)); return -1; } rc = zmq_msg_close (&msg); if (rc != 0) { printf ("error in zmq_msg_close: %s\n", zmq_strerror (errno)); return -1; } zmq_sleep (1); rc = zmq_close (s); if (rc != 0) { printf ("error in zmq_close: %s\n", zmq_strerror (errno)); return -1; } rc = zmq_term (ctx); if (rc != 0) { printf ("error in zmq_term: %s\n", zmq_strerror (errno)); return -1; } return 0; }