int XS_TEST_MAIN () { fprintf (stderr, "polltimeo test running...\n"); void *ctx = xs_init (); assert (ctx); // Create a disconnected socket. void *sb = xs_socket (ctx, XS_PULL); assert (sb); int rc = xs_bind (sb, "inproc://timeout_test"); assert (rc == 0); // Check whether timeout is honoured. xs_pollitem_t pi; pi.socket = sb; pi.events = XS_POLLIN; void *watch = xs_stopwatch_start (); rc = xs_poll (&pi, 1, 500); assert (rc == 0); unsigned long elapsed = xs_stopwatch_stop (watch) / 1000; #if !defined _WIN32 || !defined _DEBUG assert (elapsed > 440 && elapsed < 550); #endif // Check whether connection during the wait doesn't distort the timeout. void *thread = thread_create (polltimeo_worker, ctx); assert (thread); watch = xs_stopwatch_start (); rc = xs_poll (&pi, 1, 2000); assert (rc == 0); elapsed = xs_stopwatch_stop (watch) / 1000; #if !defined _WIN32 || !defined _DEBUG assert (elapsed > 1900 && elapsed < 2100); #endif thread_join (thread); // Clean-up. rc = xs_close (sb); assert (rc == 0); rc = xs_term (ctx); assert (rc == 0); return 0 ; }
int XS_TEST_MAIN () { fprintf (stderr, "linger test running...\n"); // Create socket. void *ctx = xs_init (); assert (ctx); void *s = xs_socket (ctx, XS_PUSH); assert (s); // Set linger to 0.1 second. int linger = 100; int rc = xs_setsockopt (s, XS_LINGER, &linger, sizeof (int)); // Connect to non-existent endpoing. assert (rc == 0); rc = xs_connect (s, "tcp://127.0.0.1:5560"); assert (rc == 0); // Send a message. rc = xs_send (s, "r", 1, 0); assert (rc == 1); // Close the socket. rc = xs_close (s); assert (rc == 0); // Terminate the context. This should take 0.1 second. void *watch = xs_stopwatch_start (); rc = xs_term (ctx); assert (rc == 0); int ms = (int) xs_stopwatch_stop (watch) / 1000; #if !defined _WIN32 || !defined _DEBUG assert (ms > 50 && ms < 150); #endif return 0; }
int main (int argc, char *argv []) { const char *bind_to; int message_count; size_t message_size; void *ctx; void *s; int rc; int i; xs_msg_t msg; void *watch; unsigned long elapsed; unsigned long throughput; double megabits; if (argc != 4) { printf ("usage: local_thr <bind-to> <message-size> <message-count>\n"); return 1; } bind_to = argv [1]; message_size = atoi (argv [2]); message_count = atoi (argv [3]); ctx = xs_init (); if (!ctx) { printf ("error in xs_init: %s\n", xs_strerror (errno)); return -1; } s = xs_socket (ctx, XS_PULL); if (!s) { printf ("error in xs_socket: %s\n", xs_strerror (errno)); return -1; } // Add your socket options here. // For example XS_RATE, XS_RECOVERY_IVL and XS_MCAST_LOOP for PGM. rc = xs_bind (s, bind_to); if (rc == -1) { printf ("error in xs_bind: %s\n", xs_strerror (errno)); return -1; } rc = xs_msg_init (&msg); if (rc != 0) { printf ("error in xs_msg_init: %s\n", xs_strerror (errno)); return -1; } rc = xs_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_recvmsg: %s\n", xs_strerror (errno)); return -1; } if (xs_msg_size (&msg) != message_size) { printf ("message of incorrect size received\n"); return -1; } watch = xs_stopwatch_start (); for (i = 0; i != message_count - 1; i++) { rc = xs_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_recvmsg: %s\n", xs_strerror (errno)); return -1; } if (xs_msg_size (&msg) != message_size) { printf ("message of incorrect size received\n"); return -1; } } elapsed = xs_stopwatch_stop (watch); if (elapsed == 0) elapsed = 1; rc = xs_msg_close (&msg); if (rc != 0) { printf ("error in xs_msg_close: %s\n", xs_strerror (errno)); return -1; } throughput = (unsigned long) ((double) message_count / (double) elapsed * 1000000); megabits = (double) (throughput * message_size * 8) / 1000000; printf ("message size: %d [B]\n", (int) message_size); printf ("message count: %d\n", (int) message_count); printf ("mean throughput: %d [msg/s]\n", (int) throughput); printf ("mean throughput: %.3f [Mb/s]\n", (double) megabits); rc = xs_close (s); if (rc != 0) { printf ("error in xs_close: %s\n", xs_strerror (errno)); return -1; } rc = xs_term (ctx); if (rc != 0) { printf ("error in xs_term: %s\n", xs_strerror (errno)); return -1; } return 0; }
unsigned long zmq_stopwatch_stop (void *watch) { return xs_stopwatch_stop (watch); }
int main (int argc, char *argv []) { #if defined XS_HAVE_WINDOWS HANDLE local_thread; #else pthread_t local_thread; #endif void *ctx; void *s; int rc; int i; xs_msg_t msg; void *watch; unsigned long elapsed; double latency; if (argc != 3) { printf ("usage: inproc_lat <message-size> <roundtrip-count>\n"); return 1; } message_size = atoi (argv [1]); roundtrip_count = atoi (argv [2]); ctx = xs_init (); if (!ctx) { printf ("error in xs_init: %s\n", xs_strerror (errno)); return -1; } s = xs_socket (ctx, XS_REQ); if (!s) { printf ("error in xs_socket: %s\n", xs_strerror (errno)); return -1; } rc = xs_bind (s, "inproc://lat_test"); if (rc == -1) { printf ("error in xs_bind: %s\n", xs_strerror (errno)); return -1; } #if defined XS_HAVE_WINDOWS local_thread = (HANDLE) _beginthreadex (NULL, 0, worker, ctx, 0 , NULL); if (local_thread == 0) { printf ("error in _beginthreadex\n"); return -1; } #else rc = pthread_create (&local_thread, NULL, worker, ctx); if (rc != 0) { printf ("error in pthread_create: %s\n", xs_strerror (rc)); return -1; } #endif rc = xs_msg_init_size (&msg, message_size); if (rc != 0) { printf ("error in xs_msg_init_size: %s\n", xs_strerror (errno)); return -1; } memset (xs_msg_data (&msg), 0, message_size); printf ("message size: %d [B]\n", (int) message_size); printf ("roundtrip count: %d\n", (int) roundtrip_count); watch = xs_stopwatch_start (); for (i = 0; i != roundtrip_count; i++) { rc = xs_sendmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_sendmsg: %s\n", xs_strerror (errno)); return -1; } rc = xs_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_recvmsg: %s\n", xs_strerror (errno)); return -1; } if (xs_msg_size (&msg) != message_size) { printf ("message of incorrect size received\n"); return -1; } } elapsed = xs_stopwatch_stop (watch); rc = xs_msg_close (&msg); if (rc != 0) { printf ("error in xs_msg_close: %s\n", xs_strerror (errno)); return -1; } latency = (double) elapsed / (roundtrip_count * 2); #if defined XS_HAVE_WINDOWS DWORD rc2 = WaitForSingleObject (local_thread, INFINITE); if (rc2 == WAIT_FAILED) { printf ("error in WaitForSingleObject\n"); return -1; } BOOL rc3 = CloseHandle (local_thread); if (rc3 == 0) { printf ("error in CloseHandle\n"); return -1; } #else rc = pthread_join (local_thread, NULL); if (rc != 0) { printf ("error in pthread_join: %s\n", xs_strerror (rc)); return -1; } #endif printf ("average latency: %.3f [us]\n", (double) latency); rc = xs_close (s); if (rc != 0) { printf ("error in xs_close: %s\n", xs_strerror (errno)); return -1; } rc = xs_term (ctx); if (rc != 0) { printf ("error in xs_term: %s\n", xs_strerror (errno)); return -1; } return 0; }
int main (int argc, char *argv []) { #if defined XS_HAVE_WINDOWS HANDLE local_thread; #else pthread_t local_thread; #endif void *ctx; void *s; int rc; int i; xs_msg_t msg; void *watch; unsigned long elapsed; unsigned long throughput; double megabits; if (argc != 3) { printf ("usage: thread_thr <message-size> <message-count>\n"); return 1; } message_size = atoi (argv [1]); message_count = atoi (argv [2]); ctx = xs_init (); if (!ctx) { printf ("error in xs_init: %s\n", xs_strerror (errno)); return -1; } s = xs_socket (ctx, XS_PULL); if (!s) { printf ("error in xs_socket: %s\n", xs_strerror (errno)); return -1; } rc = xs_bind (s, "inproc://thr_test"); if (rc == -1) { printf ("error in xs_bind: %s\n", xs_strerror (errno)); return -1; } #if defined XS_HAVE_WINDOWS local_thread = (HANDLE) _beginthreadex (NULL, 0, worker, ctx, 0 , NULL); if (local_thread == 0) { printf ("error in _beginthreadex\n"); return -1; } #else rc = pthread_create (&local_thread, NULL, worker, ctx); if (rc != 0) { printf ("error in pthread_create: %s\n", xs_strerror (rc)); return -1; } #endif rc = xs_msg_init (&msg); if (rc != 0) { printf ("error in xs_msg_init: %s\n", xs_strerror (errno)); return -1; } printf ("message size: %d [B]\n", (int) message_size); printf ("message count: %d\n", (int) message_count); rc = xs_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_recvmsg: %s\n", xs_strerror (errno)); return -1; } if (xs_msg_size (&msg) != message_size) { printf ("message of incorrect size received\n"); return -1; } watch = xs_stopwatch_start (); for (i = 0; i != message_count - 1; i++) { rc = xs_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_recvmsg: %s\n", xs_strerror (errno)); return -1; } if (xs_msg_size (&msg) != message_size) { printf ("message of incorrect size received\n"); return -1; } } elapsed = xs_stopwatch_stop (watch); if (elapsed == 0) elapsed = 1; rc = xs_msg_close (&msg); if (rc != 0) { printf ("error in xs_msg_close: %s\n", xs_strerror (errno)); return -1; } #if defined XS_HAVE_WINDOWS DWORD rc2 = WaitForSingleObject (local_thread, INFINITE); if (rc2 == WAIT_FAILED) { printf ("error in WaitForSingleObject\n"); return -1; } BOOL rc3 = CloseHandle (local_thread); if (rc3 == 0) { printf ("error in CloseHandle\n"); return -1; } #else rc = pthread_join (local_thread, NULL); if (rc != 0) { printf ("error in pthread_join: %s\n", xs_strerror (rc)); return -1; } #endif rc = xs_close (s); if (rc != 0) { printf ("error in xs_close: %s\n", xs_strerror (errno)); return -1; } rc = xs_term (ctx); if (rc != 0) { printf ("error in xs_term: %s\n", xs_strerror (errno)); return -1; } throughput = (unsigned long) ((double) message_count / (double) elapsed * 1000000); megabits = (double) (throughput * message_size * 8) / 1000000; printf ("mean throughput: %d [msg/s]\n", (int) throughput); printf ("mean throughput: %.3f [Mb/s]\n", (double) megabits); return 0; }
int XS_TEST_MAIN () { int rc; char buf [32]; fprintf (stderr, "survey test running...\n"); // Create the basic infrastructure. void *ctx = xs_init (); assert (ctx); void *xsurveyor = xs_socket (ctx, XS_XSURVEYOR); assert (xsurveyor); rc = xs_bind (xsurveyor, "inproc://a"); assert (rc != -1); void *xrespondent = xs_socket (ctx, XS_XRESPONDENT); assert (xrespondent); rc = xs_bind (xrespondent, "inproc://b"); assert (rc != -1); void *surveyor = xs_socket (ctx, XS_SURVEYOR); assert (surveyor); rc = xs_connect (surveyor, "inproc://b"); assert (rc != -1); void *respondent1 = xs_socket (ctx, XS_RESPONDENT); assert (respondent1); rc = xs_connect (respondent1, "inproc://a"); assert (rc != -1); void *respondent2 = xs_socket (ctx, XS_RESPONDENT); assert (respondent2); rc = xs_connect (respondent2, "inproc://a"); assert (rc != -1); // Send the survey. rc = xs_send (surveyor, "ABC", 3, 0); assert (rc == 3); // Forward the survey through the intermediate device. // Survey consist of identity (4 bytes), survey ID (4 bytes) and the body. rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xsurveyor, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xsurveyor, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 3); rc = xs_send (xsurveyor, buf, 3, 0); assert (rc == 3); // Respondent 1 responds to the survey. rc = xs_recv (respondent1, buf, sizeof (buf), 0); assert (rc == 3); rc = xs_send (respondent1, "DE", 2, 0); assert (rc == 2); // Forward the response through the intermediate device. rc = xs_recv (xsurveyor, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xsurveyor, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xsurveyor, buf, sizeof (buf), 0); assert (rc == 2); rc = xs_send (xrespondent, buf, 2, 0); assert (rc == 2); // Surveyor gets the response. rc = xs_recv (surveyor, buf, sizeof (buf), 0); assert (rc == 2); // Respondent 2 responds to the survey. rc = xs_recv (respondent2, buf, sizeof (buf), 0); assert (rc == 3); rc = xs_send (respondent2, "FGHI", 4, 0); assert (rc == 4); // Forward the response through the intermediate device. rc = xs_recv (xsurveyor, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xsurveyor, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xsurveyor, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, 0); assert (rc == 4); // Surveyor gets the response. rc = xs_recv (surveyor, buf, sizeof (buf), 0); assert (rc == 4); // Now let's test whether survey timeout works as expected. int timeout = 100; rc = xs_setsockopt (surveyor, XS_SURVEY_TIMEOUT, &timeout, sizeof (int)); assert (rc == 0); rc = xs_send (surveyor, "ABC", 3, 0); assert (rc == 3); void *watch = xs_stopwatch_start (); rc = xs_recv (surveyor, buf, sizeof (buf), 0); assert (rc == - 1 && errno == EAGAIN); unsigned long elapsed = xs_stopwatch_stop (watch) / 1000; time_assert (elapsed, (unsigned long) timeout); // Test whether responses for old surveys are discarded. First, // initiate new survey. rc = xs_setsockopt (surveyor, XS_SURVEY_TIMEOUT, &timeout, sizeof (int)); assert (rc == 0); rc = xs_send (surveyor, "DE", 2, 0); assert (rc == 2); // Read, process and reply to the old survey. rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 3); rc = xs_send (xrespondent, buf, 3, 0); assert (rc == 3); // Read, process and reply to the new survey. rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 4); rc = xs_send (xrespondent, buf, 4, XS_SNDMORE); assert (rc == 4); rc = xs_recv (xrespondent, buf, sizeof (buf), 0); assert (rc == 2); rc = xs_send (xrespondent, buf, 2, 0); assert (rc == 2); // Get the response and check it's the response to the new survey and // that response to the old survey was silently discarded. rc = xs_recv (surveyor, buf, sizeof (buf), 0); assert (rc == 2); rc = xs_close (respondent2); assert (rc == 0); rc = xs_close (respondent1); assert (rc == 0); rc = xs_close (surveyor); assert (rc == 0); rc = xs_close (xrespondent); assert (rc == 0); rc = xs_close (xsurveyor); assert (rc == 0); rc = xs_term (ctx); assert (rc == 0); return 0 ; }
int main (int argc, char *argv []) { const char *connect_to; int roundtrip_count; size_t message_size; void *ctx; void *s; int rc; int i; xs_msg_t msg; void *watch; unsigned long elapsed; double latency; if (argc != 4) { printf ("usage: remote_lat <connect-to> <message-size> " "<roundtrip-count>\n"); return 1; } connect_to = argv [1]; message_size = atoi (argv [2]); roundtrip_count = atoi (argv [3]); ctx = xs_init (); if (!ctx) { printf ("error in xs_init: %s\n", xs_strerror (errno)); return -1; } s = xs_socket (ctx, XS_REQ); if (!s) { printf ("error in xs_socket: %s\n", xs_strerror (errno)); return -1; } rc = xs_connect (s, connect_to); if (rc == -1) { printf ("error in xs_connect: %s\n", xs_strerror (errno)); return -1; } rc = xs_msg_init_size (&msg, message_size); if (rc != 0) { printf ("error in xs_msg_init_size: %s\n", xs_strerror (errno)); return -1; } memset (xs_msg_data (&msg), 0, message_size); watch = xs_stopwatch_start (); for (i = 0; i != roundtrip_count; i++) { rc = xs_sendmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_sendmsg: %s\n", xs_strerror (errno)); return -1; } rc = xs_recvmsg (s, &msg, 0); if (rc < 0) { printf ("error in xs_recvmsg: %s\n", xs_strerror (errno)); return -1; } if (xs_msg_size (&msg) != message_size) { printf ("message of incorrect size received\n"); return -1; } } elapsed = xs_stopwatch_stop (watch); rc = xs_msg_close (&msg); if (rc != 0) { printf ("error in xs_msg_close: %s\n", xs_strerror (errno)); return -1; } latency = (double) elapsed / (roundtrip_count * 2); printf ("message size: %d [B]\n", (int) message_size); printf ("roundtrip count: %d\n", (int) roundtrip_count); printf ("average latency: %.3f [us]\n", (double) latency); rc = xs_close (s); if (rc != 0) { printf ("error in xs_close: %s\n", xs_strerror (errno)); return -1; } rc = xs_term (ctx); if (rc != 0) { printf ("error in xs_term: %s\n", xs_strerror (errno)); return -1; } return 0; }