void test_reconnect_ivl_tcp_ipv6 () { if (is_ipv6_available ()) { zmq_ctx_set (get_test_context (), ZMQ_IPV6, 1); test_reconnect_ivl_tcp (bind_loopback_ipv6); } }
void test_reconnect_ivl_tcp_ipv6 () { if (is_ipv6_available ()) { zmq_ctx_set (get_test_context (), ZMQ_IPV6, 1); test_reconnect_ivl_tcp ("tcp://[::1]:*"); } }
void test_single_connect (const char *address) { size_t len = MAX_SOCKET_STRING; char my_endpoint[MAX_SOCKET_STRING]; void *ctx = zmq_ctx_new (); assert (ctx); int ipv6; if (streq (address, "tcp://127.0.0.1:*")) ipv6 = 0; else if (streq (address, "tcp://[::1]:*")) ipv6 = 1; else assert (false); if (ipv6 && !is_ipv6_available ()) { zmq_ctx_term (ctx); return; } void *sb = zmq_socket (ctx, ZMQ_REP); assert (sb); int rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb, address); assert (rc == 0); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, my_endpoint, &len); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_connect (sc, my_endpoint); assert (rc == 0); bounce (sb, sc); rc = zmq_disconnect (sc, my_endpoint); assert (rc == 0); rc = zmq_unbind (sb, my_endpoint); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); rc = zmq_ctx_term (ctx); assert (rc == 0); }
void test_single_connect_ipv6 (void) { void *ctx = zmq_ctx_new (); assert (ctx); if (!is_ipv6_available ()) { zmq_ctx_term (ctx); return; } void *sb = zmq_socket (ctx, ZMQ_REP); assert (sb); int ipv6 = 1; int rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb, "tcp://[::1]:5560"); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_connect (sc, "tcp://[::1]:5560"); assert (rc == 0); bounce (sb, sc); rc = zmq_disconnect (sc, "tcp://[::1]:5560"); assert (rc == 0); rc = zmq_unbind (sb, "tcp://[::1]:5560"); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); rc = zmq_ctx_term (ctx); assert (rc == 0); }
void test_multi_connect_ipv6 (void) { void *ctx = zmq_ctx_new (); assert (ctx); if (!is_ipv6_available ()) { zmq_ctx_term (ctx); return; } void *sb0 = zmq_socket (ctx, ZMQ_REP); assert (sb0); int ipv6 = 1; int rc = zmq_setsockopt (sb0, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb0, "tcp://[::1]:5560"); assert (rc == 0); void *sb1 = zmq_socket (ctx, ZMQ_REP); assert (sb1); rc = zmq_setsockopt (sb1, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb1, "tcp://[::1]:5561"); assert (rc == 0); void *sb2 = zmq_socket (ctx, ZMQ_REP); assert (sb2); rc = zmq_setsockopt (sb2, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb2, "tcp://[::1]:5562"); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_connect (sc, "tcp://[::1]:5560"); assert (rc == 0); rc = zmq_connect (sc, "tcp://[::1]:5561"); assert (rc == 0); rc = zmq_connect (sc, "tcp://[::1]:5564;[::1]:5562"); assert (rc == 0); bounce (sb0, sc); bounce (sb1, sc); bounce (sb2, sc); bounce (sb0, sc); bounce (sb1, sc); bounce (sb2, sc); bounce (sb0, sc); rc = zmq_disconnect (sc, "tcp://[::1]:5560"); assert (rc == 0); rc = zmq_disconnect (sc, "tcp://[::1]:5564;[::1]:5562"); assert (rc == 0); rc = zmq_disconnect (sc, "tcp://[::1]:5561"); assert (rc == 0); rc = zmq_unbind (sb0, "tcp://[::1]:5560"); assert (rc == 0); rc = zmq_unbind (sb1, "tcp://[::1]:5561"); assert (rc == 0); rc = zmq_unbind (sb2, "tcp://[::1]:5562"); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb0); assert (rc == 0); rc = zmq_close (sb1); assert (rc == 0); rc = zmq_close (sb2); assert (rc == 0); rc = zmq_ctx_term (ctx); assert (rc == 0); }
int main (void) { setup_test_environment(); void *ctx = zmq_ctx_new (); assert (ctx); int ipv6 = is_ipv6_available (); /* Address wildcard, IPv6 disabled */ void *sb = zmq_socket (ctx, ZMQ_REP); assert (sb); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); int rc = zmq_bind (sb, "tcp://*:*"); assert (rc == 0); char bindEndpoint[256]; char connectEndpoint[256]; size_t endpoint_len = sizeof (bindEndpoint); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bindEndpoint, &endpoint_len); assert (rc == 0); // Apparently Windows can't connect to 0.0.0.0. A better fix would be welcome. #ifdef ZMQ_HAVE_WINDOWS sprintf (connectEndpoint, "tcp://127.0.0.1:%s", strrchr(bindEndpoint, ':') + 1); #else strcpy (connectEndpoint, bindEndpoint); #endif rc = zmq_connect (sc, connectEndpoint); assert (rc == 0); bounce (sb, sc); rc = zmq_disconnect (sc, connectEndpoint); assert (rc == 0); rc = zmq_unbind (sb, bindEndpoint); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); /* Address wildcard, IPv6 enabled */ sb = zmq_socket (ctx, ZMQ_REP); assert (sb); sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb, "tcp://*:*"); assert (rc == 0); endpoint_len = sizeof (bindEndpoint); memset(bindEndpoint, 0, endpoint_len); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bindEndpoint, &endpoint_len); assert (rc == 0); #ifdef ZMQ_HAVE_WINDOWS if (ipv6) sprintf (connectEndpoint, "tcp://[::1]:%s", strrchr(bindEndpoint, ':') + 1); else sprintf (connectEndpoint, "tcp://127.0.0.1:%s", strrchr(bindEndpoint, ':') + 1); #else strcpy (connectEndpoint, bindEndpoint); #endif rc = zmq_connect (sc, connectEndpoint); assert (rc == 0); bounce (sb, sc); rc = zmq_disconnect (sc, connectEndpoint); assert (rc == 0); rc = zmq_unbind (sb, bindEndpoint); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); /* Port wildcard, IPv4 address, IPv6 disabled */ sb = zmq_socket (ctx, ZMQ_REP); assert (sb); sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_bind (sb, "tcp://127.0.0.1:*"); assert (rc == 0); char endpoint[256]; endpoint_len = sizeof (endpoint); memset(endpoint, 0, endpoint_len); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len); assert (rc == 0); rc = zmq_connect (sc, endpoint); assert (rc == 0); bounce (sb, sc); rc = zmq_disconnect (sc, endpoint); assert (rc == 0); rc = zmq_unbind (sb, endpoint); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); /* Port wildcard, IPv4 address, IPv6 enabled */ sb = zmq_socket (ctx, ZMQ_REP); assert (sb); sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb, "tcp://127.0.0.1:*"); assert (rc == 0); endpoint_len = sizeof (endpoint); memset(endpoint, 0, endpoint_len); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len); assert (rc == 0); rc = zmq_connect (sc, endpoint); assert (rc == 0); bounce (sb, sc); rc = zmq_disconnect (sc, endpoint); assert (rc == 0); rc = zmq_unbind (sb, endpoint); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); if (ipv6) { /* Port wildcard, IPv6 address, IPv6 enabled */ sb = zmq_socket (ctx, ZMQ_REP); assert (sb); sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb, "tcp://[::1]:*"); assert (rc == 0); endpoint_len = sizeof (endpoint); memset(endpoint, 0, endpoint_len); rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len); assert (rc == 0); rc = zmq_connect (sc, endpoint); assert (rc == 0); bounce (sb, sc); rc = zmq_disconnect (sc, endpoint); assert (rc == 0); rc = zmq_unbind (sb, endpoint); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb); assert (rc == 0); } rc = zmq_ctx_term (ctx); assert (rc == 0); return 0; }
void test_multi_connect (const char *address) { size_t len = MAX_SOCKET_STRING; char my_endpoint_0[MAX_SOCKET_STRING]; char my_endpoint_1[MAX_SOCKET_STRING]; char my_endpoint_2[MAX_SOCKET_STRING]; char my_endpoint_3[MAX_SOCKET_STRING * 2]; void *ctx = zmq_ctx_new (); assert (ctx); int ipv6; if (streq (address, "tcp://127.0.0.1:*")) ipv6 = 0; else if (streq (address, "tcp://[::1]:*")) ipv6 = 1; else assert (false); if (ipv6 && !is_ipv6_available ()) { zmq_ctx_term (ctx); return; } void *sb0 = zmq_socket (ctx, ZMQ_REP); assert (sb0); int rc = zmq_setsockopt (sb0, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb0, address); assert (rc == 0); rc = zmq_getsockopt (sb0, ZMQ_LAST_ENDPOINT, my_endpoint_0, &len); assert (rc == 0); void *sb1 = zmq_socket (ctx, ZMQ_REP); assert (sb1); rc = zmq_setsockopt (sb1, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb1, address); assert (rc == 0); len = MAX_SOCKET_STRING; rc = zmq_getsockopt (sb1, ZMQ_LAST_ENDPOINT, my_endpoint_1, &len); assert (rc == 0); void *sb2 = zmq_socket (ctx, ZMQ_REP); assert (sb2); rc = zmq_setsockopt (sb2, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_bind (sb2, address); assert (rc == 0); len = MAX_SOCKET_STRING; rc = zmq_getsockopt (sb2, ZMQ_LAST_ENDPOINT, my_endpoint_2, &len); assert (rc == 0); void *sc = zmq_socket (ctx, ZMQ_REQ); assert (sc); rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)); assert (rc == 0); rc = zmq_connect (sc, my_endpoint_0); assert (rc == 0); rc = zmq_connect (sc, my_endpoint_1); assert (rc == 0); if (!ipv6) sprintf (my_endpoint_3, "tcp://127.0.0.1:5564;%s", strrchr (my_endpoint_2, '/') + 1); else sprintf (my_endpoint_3, "tcp://[::1]:5564;%s", strrchr (my_endpoint_2, '/') + 1); rc = zmq_connect (sc, my_endpoint_3); assert (rc == 0); bounce (sb0, sc); bounce (sb1, sc); bounce (sb2, sc); bounce (sb0, sc); bounce (sb1, sc); bounce (sb2, sc); bounce (sb0, sc); rc = zmq_disconnect (sc, my_endpoint_0); assert (rc == 0); rc = zmq_disconnect (sc, my_endpoint_3); assert (rc == 0); rc = zmq_disconnect (sc, my_endpoint_1); assert (rc == 0); rc = zmq_unbind (sb0, my_endpoint_0); assert (rc == 0); rc = zmq_unbind (sb1, my_endpoint_1); assert (rc == 0); rc = zmq_unbind (sb2, my_endpoint_2); assert (rc == 0); rc = zmq_close (sc); assert (rc == 0); rc = zmq_close (sb0); assert (rc == 0); rc = zmq_close (sb1); assert (rc == 0); rc = zmq_close (sb2); assert (rc == 0); rc = zmq_ctx_term (ctx); assert (rc == 0); }