void test_ctx_shutdown() { int rc; // Set up our context and sockets void *ctx = zmq_ctx_new (); assert (ctx); void *socket = zmq_socket (ctx, ZMQ_PULL); assert (socket); // Spawn a thread to receive on socket void *receiver_thread = zmq_threadstart (&receiver, socket); // Wait for thread to start up and block zmq_sleep (1); // Shutdown context, if we used destroy here we would deadlock. rc = zmq_ctx_shutdown (ctx); assert (rc == 0); // Wait for thread to finish zmq_threadclose (receiver_thread); // Close the socket. rc = zmq_close (socket); assert (rc == 0); // Destory the context, will now not hang as we have closed the socket. rc = zmq_ctx_destroy (ctx); assert (rc == 0); }
int main (int argc, char *argv []) { if (argc != 4) { printf ("usage: local_lat <bind-to> <message-size> " "<roundtrip-count>\n"); return 1; } const char *bind_to = argv [1]; size_t message_size = (size_t) atoi (argv [2]); int roundtrip_count = atoi (argv [3]); zmq::context_t ctx (1, 1); zmq::socket_t s (ctx, ZMQ_REP); s.bind (bind_to); for (int i = 0; i != roundtrip_count; i++) { zmq::message_t msg; s.recv (&msg); assert (msg.size () == message_size); s.send (msg); } zmq_sleep (1); return 0; }
int main (int argc, char *argv []) { if (argc != 4) { printf ("usage: remote_thr <connect-to> <message-size> " "<message-count>\n"); return 1; } const char *connect_to = argv [1]; size_t message_size = (size_t) atoi (argv [2]); int message_count = atoi (argv [3]); zmq::context_t ctx (1, 1); zmq::socket_t s (ctx, ZMQ_PUB); // Add your socket options here. // For example ZMQ_RATE, ZMQ_RECOVERY_IVL and ZMQ_MCAST_LOOP for PGM. s.connect (connect_to); for (int i = 0; i != message_count; i++) { zmq::message_t msg (message_size); s.send (msg); } zmq_sleep (10); return 0; }
int main (int argc, char *argv []) { const char *bind_to; int roundtrip_count; int message_size; void *ctx; void *s; int rc; int i; zmq_msg_t msg; if (argc != 4) { printf ("usage: local_lat <bind-to> <message-size> " "<roundtrip-count>\n"); return 1; } bind_to = argv [1]; message_size = atoi (argv [2]); roundtrip_count = atoi (argv [3]); ctx = zmq_init (1, 1, 0); assert (ctx); s = zmq_socket (ctx, ZMQ_REP); assert (s); rc = zmq_bind (s, bind_to); assert (rc == 0); rc = zmq_msg_init (&msg); assert (rc == 0); for (i = 0; i != roundtrip_count; i++) { rc = zmq_recv (s, &msg, 0); assert (rc == 0); assert (zmq_msg_size (&msg) == message_size); rc = zmq_send (s, &msg, 0); assert (rc == 0); } rc = zmq_msg_close (&msg); assert (rc == 0); zmq_sleep (1); rc = zmq_close (s); assert (rc == 0); rc = zmq_term (ctx); assert (rc == 0); return 0; }
int main (void) { fprintf (stderr, "test_router_mandatory2 running...\n"); void *ctx = zmq_init (1); assert (ctx); // Creating the first socket. void *sa = zmq_socket (ctx, ZMQ_ROUTER); assert (sa); int rc = zmq_bind (sa, "tcp://127.0.0.1:15560"); assert (rc == 0); // Sending a message to an unknown peer with the default setting rc = zmq_send (sa, "SOCKET", 6, ZMQ_SNDMORE); assert (rc == 6); rc = zmq_send (sa, "DATA", 4, 0); assert (rc == 4); int mandatory = 1; // Set mandatory routing on socket rc = zmq_setsockopt (sa, ZMQ_ROUTER_MANDATORY, &mandatory, sizeof (mandatory)); assert (rc == 0); // Send a message and check that it fails rc = zmq_send (sa, "SOCKET", 6, ZMQ_SNDMORE | ZMQ_DONTWAIT); assert (rc == -1 && errno == EHOSTUNREACH); //create a receiver socket void *receiver = zmq_socket (ctx, ZMQ_ROUTER); assert (receiver); //give it a name rc = zmq_setsockopt (receiver, ZMQ_IDENTITY, "SOCKET", 6); assert (rc == 0); //connect to sender rc = zmq_connect (receiver, "tcp://127.0.0.1:15560"); assert (rc == 0); //sleep to connect zmq_sleep(1); // Send a message and check that it NOT fails rc = zmq_send (sa, "SOCKET", 6, ZMQ_SNDMORE); assert (rc == 6); rc = zmq_send (sa, "DATA", 4, 0); assert (rc == 4); //sleep to receive zmq_sleep(1); //receive it on socket //TODO: char buffer[16]; memset (&buffer, 0, sizeof(buffer)); rc = zmq_recv (receiver, &buffer, sizeof(buffer), ZMQ_DONTWAIT); assert(rc > 0); rc = zmq_recv (receiver, &buffer, sizeof(buffer), ZMQ_DONTWAIT); printf ("rc is %d, in buffer: %s \n",rc, buffer); assert(rc == 4); //close receiver socket rc = zmq_close(receiver); assert (rc == 0); //sleep to disconnect zmq_sleep(5); //send again to check if fails // Send a message and check that it fails rc = zmq_send (sa, "SOCKET", 6, ZMQ_SNDMORE | ZMQ_DONTWAIT); printf ("rc is %d\n", rc); assert (rc == -1 && errno == EHOSTUNREACH); //closing stuff rc = zmq_close (sa); assert (rc == 0); rc = zmq_term (ctx); assert (rc == 0); 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; if (argc != 4) { printf ("usage: local_lat <bind-to> <message-size> " "<roundtrip-count>\n"); 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_REP); if (!s) { printf ("error in zmq_socket: %s\n", zmq_strerror (errno)); return -1; } 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; } for (i = 0; i != roundtrip_count; i++) { rc = zmq_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in zmq_recvmsg: %s\n", zmq_strerror (errno)); return -1; } if (zmq_msg_size (&msg) != message_size) { printf ("message of incorrect size received\n"); return -1; } rc = zmq_sendmsg (s, &msg, 0); if (rc < 0) { printf ("error in zmq_sendmsg: %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; }
int main (void) { setup_test_environment(); int val; int rc; char buffer[16]; // TEST 1. // First we're going to attempt to send messages to two // pipes, one connected, the other not. We should see // the PUSH load balancing to both pipes, and hence half // of the messages getting queued, as connect() creates a // pipe immediately. void *context = zmq_ctx_new(); assert (context); void *to = zmq_socket(context, ZMQ_PULL); assert (to); // Bind the one valid receiver val = 0; rc = zmq_setsockopt(to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); rc = zmq_bind (to, "tcp://*:6555"); assert (rc == 0); // Create a socket pushing to two endpoints - only 1 message should arrive. void *from = zmq_socket (context, ZMQ_PUSH); assert(from); val = 0; zmq_setsockopt (from, ZMQ_LINGER, &val, sizeof (val)); // This pipe will not connect rc = zmq_connect (from, "tcp://localhost:5556"); assert (rc == 0); // This pipe will rc = zmq_connect (from, "tcp://localhost:6555"); assert (rc == 0); // We send 10 messages, 5 should just get stuck in the queue // for the not-yet-connected pipe for (int i = 0; i < 10; ++i) { rc = zmq_send (from, "Hello", 5, 0); assert (rc == 5); } // We now consume from the connected pipe // - we should see just 5 int timeout = 100; rc = zmq_setsockopt (to, ZMQ_RCVTIMEO, &timeout, sizeof (int)); assert (rc == 0); int seen = 0; while (true) { rc = zmq_recv (to, &buffer, sizeof (buffer), 0); if (rc == -1) break; // Break when we didn't get a message seen++; } assert (seen == 5); rc = zmq_close (from); assert (rc == 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_ctx_term (context); assert (rc == 0); // TEST 2 // This time we will do the same thing, connect two pipes, // one of which will succeed in connecting to a bound // receiver, the other of which will fail. However, we will // also set the delay attach on connect flag, which should // cause the pipe attachment to be delayed until the connection // succeeds. context = zmq_ctx_new(); // Bind the valid socket to = zmq_socket (context, ZMQ_PULL); assert (to); rc = zmq_bind (to, "tcp://*:5560"); assert (rc == 0); val = 0; rc = zmq_setsockopt (to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); // Create a socket pushing to two endpoints - all messages should arrive. from = zmq_socket (context, ZMQ_PUSH); assert (from); val = 0; rc = zmq_setsockopt (from, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); // Set the key flag val = 1; rc = zmq_setsockopt (from, ZMQ_DELAY_ATTACH_ON_CONNECT, &val, sizeof(val)); assert (rc == 0); // Connect to the invalid socket rc = zmq_connect (from, "tcp://localhost:5561"); assert (rc == 0); // Connect to the valid socket rc = zmq_connect (from, "tcp://localhost:5560"); assert (rc == 0); // Send 10 messages, all should be routed to the connected pipe for (int i = 0; i < 10; ++i) { rc = zmq_send (from, "Hello", 5, 0); assert (rc == 5); } rc = zmq_setsockopt (to, ZMQ_RCVTIMEO, &timeout, sizeof (int)); assert (rc == 0); seen = 0; while (true) { rc = zmq_recv (to, &buffer, sizeof (buffer), 0); if (rc == -1) break; // Break when we didn't get a message seen++; } assert (seen == 10); rc = zmq_close (from); assert (rc == 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_ctx_term (context); assert (rc == 0); // TEST 3 // This time we want to validate that the same blocking behaviour // occurs with an existing connection that is broken. We will send // messages to a connected pipe, disconnect and verify the messages // block. Then we reconnect and verify messages flow again. context = zmq_ctx_new (); void *backend = zmq_socket (context, ZMQ_DEALER); assert (backend); void *frontend = zmq_socket (context, ZMQ_DEALER); assert (frontend); int zero = 0; rc = zmq_setsockopt (backend, ZMQ_LINGER, &zero, sizeof (zero)); assert (rc == 0); rc = zmq_setsockopt (frontend, ZMQ_LINGER, &zero, sizeof (zero)); assert (rc == 0); // Frontend connects to backend using DELAY_ATTACH_ON_CONNECT int on = 1; rc = zmq_setsockopt (frontend, ZMQ_DELAY_ATTACH_ON_CONNECT, &on, sizeof (on)); assert (rc == 0); rc = zmq_bind (backend, "tcp://*:5560"); assert (rc == 0); rc = zmq_connect (frontend, "tcp://localhost:5560"); assert (rc == 0); // Ping backend to frontend so we know when the connection is up rc = zmq_send (backend, "Hello", 5, 0); assert (rc == 5); rc = zmq_recv (frontend, buffer, 255, 0); assert (rc == 5); // Send message from frontend to backend rc = zmq_send (frontend, "Hello", 5, ZMQ_DONTWAIT); assert (rc == 5); rc = zmq_close (backend); assert (rc == 0); // Give time to process disconnect // There's no way to do this except with a sleep zmq_sleep(1); // Send a message, should fail rc = zmq_send (frontend, "Hello", 5, ZMQ_DONTWAIT); assert (rc == -1); // Recreate backend socket backend = zmq_socket (context, ZMQ_DEALER); assert (backend); rc = zmq_setsockopt (backend, ZMQ_LINGER, &zero, sizeof (zero)); assert (rc == 0); rc = zmq_bind (backend, "tcp://*:5560"); assert (rc == 0); // Ping backend to frontend so we know when the connection is up rc = zmq_send (backend, "Hello", 5, 0); assert (rc == 5); rc = zmq_recv (frontend, buffer, 255, 0); assert (rc == 5); // After the reconnect, should succeed rc = zmq_send (frontend, "Hello", 5, ZMQ_DONTWAIT); assert (rc == 5); rc = zmq_close (backend); assert (rc == 0); rc = zmq_close (frontend); assert (rc == 0); rc = zmq_ctx_term (context); assert (rc == 0); }
int main (void) { int rc; char buf[32]; const char *ep = "tcp://127.0.0.1:5560"; fprintf (stderr, "unbind endpoint test running...\n"); // Create infrastructure. void *ctx = zmq_init (1); assert (ctx); void *push = zmq_socket (ctx, ZMQ_PUSH); assert (push); rc = zmq_bind (push, ep); assert (rc == 0); void *pull = zmq_socket (ctx, ZMQ_PULL); assert (pull); rc = zmq_connect (pull, ep); assert (rc == 0); // Pass one message through to ensure the connection is established. rc = zmq_send (push, "ABC", 3, 0); assert (rc == 3); rc = zmq_recv (pull, buf, sizeof (buf), 0); assert (rc == 3); // Unbind the lisnening endpoint rc = zmq_unbind (push, ep); assert (rc == 0); // Let events some time zmq_sleep (1); // Check that sending would block (there's no outbound connection). rc = zmq_send (push, "ABC", 3, ZMQ_DONTWAIT); assert (rc == -1 && zmq_errno () == EAGAIN); // Clean up. rc = zmq_close (pull); assert (rc == 0); rc = zmq_close (push); assert (rc == 0); rc = zmq_term (ctx); assert (rc == 0); // Now the other way round. fprintf (stderr, "disconnect endpoint test running...\n"); // Create infrastructure. ctx = zmq_init (1); assert (ctx); push = zmq_socket (ctx, ZMQ_PUSH); assert (push); rc = zmq_connect (push, ep); assert (rc == 0); pull = zmq_socket (ctx, ZMQ_PULL); assert (pull); rc = zmq_bind (pull, ep); assert (rc == 0); // Pass one message through to ensure the connection is established. rc = zmq_send (push, "ABC", 3, 0); assert (rc == 3); rc = zmq_recv (pull, buf, sizeof (buf), 0); assert (rc == 3); // Disconnect the bound endpoint rc = zmq_disconnect (push, ep); assert (rc == 0); // Let events some time zmq_sleep (1); // Check that sending would block (there's no inbound connections). rc = zmq_send (push, "ABC", 3, ZMQ_DONTWAIT); assert (rc == -1 && zmq_errno () == EAGAIN); // Clean up. rc = zmq_close (pull); assert (rc == 0); rc = zmq_close (push); assert (rc == 0); rc = zmq_term (ctx); assert (rc == 0); return 0; }
int main (void) { fprintf (stderr, "test_router_mandatory running...\n"); void *ctx = zmq_init (1); assert (ctx); // Creating the first socket. void *sa = zmq_socket (ctx, ZMQ_ROUTER); assert (sa); int hwm = 1; int rc = zmq_setsockopt (sa, ZMQ_SNDHWM, &hwm, sizeof (hwm)); assert (rc == 0); rc = zmq_bind (sa, "tcp://127.0.0.1:15560"); assert (rc == 0); // Sending a message to an unknown peer with the default setting rc = zmq_send (sa, "UNKNOWN", 7, ZMQ_SNDMORE); assert (rc == 7); rc = zmq_send (sa, "DATA", 4, 0); assert (rc == 4); int mandatory = 1; // Set mandatory routing on socket rc = zmq_setsockopt (sa, ZMQ_ROUTER_MANDATORY, &mandatory, sizeof (mandatory)); assert (rc == 0); // Send a message and check that it fails rc = zmq_send (sa, "UNKNOWN", 7, ZMQ_SNDMORE | ZMQ_DONTWAIT); assert (rc == -1 && errno == EHOSTUNREACH); // Create a valid socket void *sb = zmq_socket (ctx, ZMQ_DEALER); assert (sb); rc = zmq_setsockopt (sb, ZMQ_RCVHWM, &hwm, sizeof (hwm)); assert (rc == 0); rc = zmq_setsockopt (sb, ZMQ_IDENTITY, "X", 1); assert (rc == 0); rc = zmq_connect (sb, "tcp://127.0.0.1:15560"); assert (rc == 0); // wait until connect zmq_sleep (1); // make it full and check that it fails rc = zmq_send (sa, "X", 1, ZMQ_SNDMORE); assert (rc == 1); rc = zmq_send (sa, "DATA1", 5, 0); assert (rc == 5); rc = zmq_send (sa, "X", 1, ZMQ_SNDMORE | ZMQ_DONTWAIT); if (rc == 1) { // the first frame has been sent rc = zmq_send (sa, "DATA2", 5, 0); assert (rc == 5); // send more rc = zmq_send (sa, "X", 1, ZMQ_SNDMORE | ZMQ_DONTWAIT); } assert (rc == -1 && errno == EAGAIN); rc = zmq_close (sa); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); rc = zmq_term (ctx); assert (rc == 0); return 0 ; }
int main (void) { setup_test_environment(); int rc; void *req; void *req2; void *rep; void* threads [3]; addr = "tcp://127.0.0.1:5560"; // Create the infrastructure void *ctx = zmq_ctx_new (); assert (ctx); // REP socket rep = zmq_socket (ctx, ZMQ_REP); assert (rep); // Assert supported protocols rc = zmq_socket_monitor (rep, addr.c_str(), 0); assert (rc == -1); assert (zmq_errno() == EPROTONOSUPPORT); // Deregister monitor rc = zmq_socket_monitor (rep, NULL, 0); assert (rc == 0); // REP socket monitor, all events rc = zmq_socket_monitor (rep, "inproc://monitor.rep", ZMQ_EVENT_ALL); assert (rc == 0); threads [0] = zmq_threadstart(&rep_socket_monitor, ctx); // REQ socket req = zmq_socket (ctx, ZMQ_REQ); assert (req); // REQ socket monitor, all events rc = zmq_socket_monitor (req, "inproc://monitor.req", ZMQ_EVENT_ALL); assert (rc == 0); threads [1] = zmq_threadstart(&req_socket_monitor, ctx); zmq_sleep(1); // Bind REQ and REP rc = zmq_bind (rep, addr.c_str()); assert (rc == 0); rc = zmq_connect (req, addr.c_str()); assert (rc == 0); bounce (rep, req); // 2nd REQ socket req2 = zmq_socket (ctx, ZMQ_REQ); assert (req2); // 2nd REQ socket monitor, connected event only rc = zmq_socket_monitor (req2, "inproc://monitor.req2", ZMQ_EVENT_CONNECTED); assert (rc == 0); threads [2] = zmq_threadstart(&req2_socket_monitor, ctx); rc = zmq_connect (req2, addr.c_str()); assert (rc == 0); // Close the REP socket rc = zmq_close (rep); assert (rc == 0); // Allow some time for detecting error states zmq_sleep(1); // Close the REQ socket rc = zmq_close (req); assert (rc == 0); // Close the 2nd REQ socket rc = zmq_close (req2); assert (rc == 0); zmq_ctx_term (ctx); // Expected REP socket events assert (rep_socket_events & ZMQ_EVENT_LISTENING); assert (rep_socket_events & ZMQ_EVENT_ACCEPTED); assert (rep_socket_events & ZMQ_EVENT_CLOSED); // Expected REQ socket events assert (req_socket_events & ZMQ_EVENT_CONNECTED); assert (req_socket_events & ZMQ_EVENT_DISCONNECTED); assert (req_socket_events & ZMQ_EVENT_CLOSED); // Expected 2nd REQ socket events assert (req2_socket_events & ZMQ_EVENT_CONNECTED); assert (!(req2_socket_events & ZMQ_EVENT_CLOSED)); for (unsigned int i = 0; i < 3; ++i) zmq_threadclose(threads [i]); 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; }
int main (int argc, char *argv []) { const char *connect_to; int message_count; int message_size; void *ctx; void *s; int rc; int i; zmq_msg_t msg; if (argc != 4) { printf ("usage: remote_thr <connect-to> <message-size> " "<message-count>\n"); return 1; } connect_to = argv [1]; message_size = atoi (argv [2]); message_count = atoi (argv [3]); ctx = zmq_init (1, 1, 0); if (!ctx) { printf ("error in zmq_recv: %s\n", zmq_strerror (errno)); return -1; } s = zmq_socket (ctx, ZMQ_PUB); if (!s) { printf ("error in zmq_socket: %s\n", zmq_strerror (errno)); return -1; } // Add your socket options here. // For example ZMQ_RATE, ZMQ_RECOVERY_IVL and ZMQ_MCAST_LOOP for PGM. rc = zmq_connect (s, connect_to); if (rc != 0) { printf ("error in zmq_connect: %s\n", zmq_strerror (errno)); return -1; } for (i = 0; i != message_count; i++) { rc = zmq_msg_init_size (&msg, message_size); if (rc != 0) { printf ("error in zmq_msg_init_size: %s\n", zmq_strerror (errno)); return -1; } rc = zmq_send (s, &msg, 0); if (rc != 0) { printf ("error in zmq_send: %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 (10); 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; }
int main (int argc, char *argv []) { void *ctx = zmq_init (1); assert (ctx); pthread_t thread; int rc = pthread_create (&thread, NULL, queue, ctx); assert (rc == 0); void *sb = zmq_socket (ctx, ZMQ_REP); assert (sb); rc = zmq_connect (sb, transport_be); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_connect (sc, transport_fe); assert (rc == 0); bounce (sb, sc); void *sb2 = zmq_socket (ctx, ZMQ_REP); assert (sb2); rc = zmq_connect (sb2, transport_be); assert (rc == 0); void *sc2 = zmq_socket (ctx, ZMQ_REQ); assert (sc2); rc = zmq_connect (sc2, transport_fe); assert (rc == 0); zmq_sleep(1); const char *content = "12345678ABCDEFGH12345678abcdefgh"; const char *content2 = "12345678NOPQRSTU12345678nopqrstu"; rc = zmq_send (sc, content, 32, 0); assert (rc == 32); rc = zmq_send (sc2, content2, 32, 0); assert (rc == 32); char buf [32]; rc = zmq_recv (sb, buf, 32, 0); assert (rc == 32); char buf2 [32]; rc = zmq_recv (sb2, buf2, 32, 0); assert (rc == 32); rc = zmq_send (sb2, buf2, 32, 0); assert (rc == 32); rc = zmq_send (sb, buf, 32, 0); assert (rc == 32); char reply [32]; rc = zmq_recv (sc, reply, 32, 0); assert (rc == 32); assert (memcmp (reply, content, 32) == 0); char reply2 [32]; rc = zmq_recv (sc2, reply2, 32, 0); assert (rc == 32); assert (memcmp (reply2, content2, 32) == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); rc = zmq_close (sc2); assert (rc == 0); rc = zmq_close (sb2); assert (rc == 0); rc = zmq_term (ctx); assert (rc == 0); return 0 ; }
int main (void) { fprintf (stderr, "test_connect_delay running...\n"); int val; int rc; char buffer[16]; int seen = 0; void *context = zmq_ctx_new(); assert (context); void *to = zmq_socket(context, ZMQ_PULL); assert (to); val = 0; rc = zmq_setsockopt(to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); rc = zmq_bind(to, "tcp://*:5555"); assert (rc == 0); // Create a socket pushing to two endpoints - only 1 message should arrive. void *from = zmq_socket (context, ZMQ_PUSH); assert(from); val = 0; zmq_setsockopt (from, ZMQ_LINGER, &val, sizeof(val)); rc = zmq_connect (from, "tcp://localhost:5556"); assert (rc == 0); rc = zmq_connect (from, "tcp://localhost:5555"); assert (rc == 0); for (int i = 0; i < 10; ++i) { std::string message("message "); message += ('0' + i); rc = zmq_send (from, message.data(), message.size(), 0); assert(rc >= 0); } zmq_sleep (1); seen = 0; for (int i = 0; i < 10; ++i) { memset (&buffer, 0, sizeof(buffer)); rc = zmq_recv (to, &buffer, sizeof(buffer), ZMQ_DONTWAIT); if( rc == -1) break; seen++; } assert (seen == 5); rc = zmq_close (from); assert (rc == 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_ctx_destroy(context); assert (rc == 0); context = zmq_ctx_new(); fprintf (stderr, " Rerunning with DELAY_ATTACH_ON_CONNECT\n"); to = zmq_socket (context, ZMQ_PULL); assert (to); rc = zmq_bind (to, "tcp://*:5560"); assert (rc == 0); val = 0; rc = zmq_setsockopt (to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); // Create a socket pushing to two endpoints - all messages should arrive. from = zmq_socket (context, ZMQ_PUSH); assert (from); val = 0; rc = zmq_setsockopt (from, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); val = 1; rc = zmq_setsockopt (from, ZMQ_DELAY_ATTACH_ON_CONNECT, &val, sizeof(val)); assert (rc == 0); rc = zmq_connect (from, "tcp://localhost:5561"); assert (rc == 0); rc = zmq_connect (from, "tcp://localhost:5560"); assert (rc == 0); for (int i = 0; i < 10; ++i) { std::string message("message "); message += ('0' + i); rc = zmq_send (from, message.data(), message.size(), 0); assert (rc >= 0); } zmq_sleep (1); seen = 0; for (int i = 0; i < 10; ++i) { memset(&buffer, 0, sizeof(buffer)); rc = zmq_recv (to, &buffer, sizeof(buffer), ZMQ_DONTWAIT); assert (rc != -1); } rc = zmq_close (from); assert (rc == 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_ctx_destroy(context); assert (rc == 0); fprintf (stderr, " Running DELAY_ATTACH_ON_CONNECT with disconnect\n"); pthread_t serv, work; rc = pthread_create (&serv, NULL, server, NULL); assert (rc == 0); rc = pthread_create (&work, NULL, worker, NULL); assert (rc == 0); pthread_exit(NULL); }
int main (void) { fprintf (stderr, "test_connect_delay running...\n"); int val; int rc; char buffer[16]; int seen = 0; // TEST 1. // First we're going to attempt to send messages to two // pipes, one connected, the other not. We should see // the PUSH load balancing to both pipes, and hence half // of the messages getting queued, as connect() creates a // pipe immediately. void *context = zmq_ctx_new(); assert (context); void *to = zmq_socket(context, ZMQ_PULL); assert (to); // Bind the one valid receiver val = 0; rc = zmq_setsockopt(to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); rc = zmq_bind(to, "tcp://*:6555"); assert (rc == 0); // Create a socket pushing to two endpoints - only 1 message should arrive. void *from = zmq_socket (context, ZMQ_PUSH); assert(from); val = 0; zmq_setsockopt (from, ZMQ_LINGER, &val, sizeof(val)); // This pipe will not connect rc = zmq_connect (from, "tcp://localhost:5556"); assert (rc == 0); // This pipe will rc = zmq_connect (from, "tcp://localhost:5555"); assert (rc == 0); // We send 10 messages, 5 should just get stuck in the queue // for the not-yet-connected pipe for (int i = 0; i < 10; ++i) { std::string message("message "); message += ('0' + i); rc = zmq_send (from, message.data(), message.size(), 0); assert(rc >= 0); } // Sleep to allow the messages to be delivered zmq_sleep (1); // We now consume from the connected pipe // - we should see just 5 seen = 0; for (int i = 0; i < 10; ++i) { memset (&buffer, 0, sizeof(buffer)); rc = zmq_recv (to, &buffer, sizeof(buffer), ZMQ_DONTWAIT); if( rc == -1) break; seen++; } assert (seen == 5); rc = zmq_close (from); assert (rc == 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_ctx_destroy(context); assert (rc == 0); // TEST 2 // This time we will do the same thing, connect two pipes, // one of which will succeed in connecting to a bound // receiver, the other of which will fail. However, we will // also set the delay attach on connect flag, which should // cause the pipe attachment to be delayed until the connection // succeeds. context = zmq_ctx_new(); fprintf (stderr, " Rerunning with DELAY_ATTACH_ON_CONNECT\n"); // Bind the valid socket to = zmq_socket (context, ZMQ_PULL); assert (to); rc = zmq_bind (to, "tcp://*:5560"); assert (rc == 0); val = 0; rc = zmq_setsockopt (to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); // Create a socket pushing to two endpoints - all messages should arrive. from = zmq_socket (context, ZMQ_PUSH); assert (from); val = 0; rc = zmq_setsockopt (from, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); // Set the key flag val = 1; rc = zmq_setsockopt (from, ZMQ_DELAY_ATTACH_ON_CONNECT, &val, sizeof(val)); assert (rc == 0); // Connect to the invalid socket rc = zmq_connect (from, "tcp://localhost:5561"); assert (rc == 0); // Connect to the valid socket rc = zmq_connect (from, "tcp://localhost:5560"); assert (rc == 0); // Send 10 messages, all should be routed to the connected pipe for (int i = 0; i < 10; ++i) { std::string message("message "); message += ('0' + i); rc = zmq_send (from, message.data(), message.size(), 0); assert (rc >= 0); } // Sleep to allow the messages to be delivered zmq_sleep (1); // Send 10 messages, all should arrive. seen = 0; for (int i = 0; i < 10; ++i) { memset(&buffer, 0, sizeof(buffer)); rc = zmq_recv (to, &buffer, sizeof(buffer), ZMQ_DONTWAIT); // If there is a failed delivery, assert! assert (rc != -1); } rc = zmq_close (from); assert (rc == 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_ctx_destroy(context); assert (rc == 0); // TEST 3 // This time we want to validate that the same blocking behaviour // occurs with an existing connection that is broken. We will send // messaages to a connected pipe, disconnect and verify the messages // block. Then we reconnect and verify messages flow again. context = zmq_ctx_new(); void *context2 = zmq_ctx_new(); fprintf (stderr, " Running DELAY_ATTACH_ON_CONNECT with disconnect\n"); to = zmq_socket (context2, ZMQ_PULL); assert (to); rc = zmq_bind (to, "tcp://*:5560"); assert (rc == 0); val = 0; rc = zmq_setsockopt (to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); // Create a socket pushing from = zmq_socket (context, ZMQ_PUSH); assert (from); val = 0; rc = zmq_setsockopt (from, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); val = 1; rc = zmq_setsockopt (from, ZMQ_DELAY_ATTACH_ON_CONNECT, &val, sizeof(val)); assert (rc == 0); // Connect to the valid socket socket rc = zmq_connect (from, "tcp://localhost:5560"); assert (rc == 0); // Allow connections to stabilise zmq_sleep(1); // Send a message, should succeed std::string message("message "); rc = zmq_send (from, message.data(), message.size(), 0); assert (rc >= 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_ctx_destroy(context2); assert (rc == 0); // Give time to process disconnect zmq_sleep(1); // Send a message, should fail rc = zmq_send (from, message.data(), message.size(), ZMQ_DONTWAIT); assert (rc == -1); context2 = zmq_ctx_new(); to = zmq_socket (context2, ZMQ_PULL); assert (to); rc = zmq_bind (to, "tcp://*:5560"); assert (rc == 0); val = 0; rc = zmq_setsockopt (to, ZMQ_LINGER, &val, sizeof(val)); assert (rc == 0); // Allow connections to stabilise zmq_sleep(1); // After the reconnect, should succeed rc = zmq_send (from, message.data(), message.size(), 0); assert (rc >= 0); rc = zmq_close (to); assert (rc == 0); rc = zmq_close (from); assert (rc == 0); rc = zmq_ctx_destroy(context); assert (rc == 0); rc = zmq_ctx_destroy(context2); assert (rc == 0); }