libzmq  master
ZeroMQ C++ Core Engine (LIBZMQ)
test_unbind_wildcard.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3 
4  This file is part of 0MQ.
5 
6  0MQ is free software; you can redistribute it and/or modify it under
7  the terms of the GNU Lesser General Public License as published by
8  the Free Software Foundation; either version 3 of the License, or
9  (at your option) any later version.
10 
11  0MQ is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "testutil.hpp"
21 
22 int main (void)
23 {
25  int ipv6 = is_ipv6_available ();
26  void *ctx = zmq_ctx_new ();
27  assert (ctx);
28 
29  /* Address wildcard, IPv6 disabled */
30  void *sb = zmq_socket (ctx, ZMQ_REP);
31  assert (sb);
32  void *sc = zmq_socket (ctx, ZMQ_REQ);
33  assert (sc);
34 
35  int rc = zmq_bind (sb, "tcp://*:5555");
36  assert (rc == 0);
37 
38  char bindEndpoint[256];
39  size_t endpoint_len = sizeof (bindEndpoint);
40  rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bindEndpoint, &endpoint_len);
41  assert (rc == 0);
42 
43  char connectEndpoint[256];
44 
45 #ifdef ZMQ_HAVE_WINDOWS
46  strcpy(connectEndpoint, "tcp://127.0.0.1:5555");
47 #else
48  strcpy(connectEndpoint, bindEndpoint);
49 #endif
50 
51  rc = zmq_connect (sc, connectEndpoint);
52  assert (rc == 0);
53 
54  bounce (sb, sc);
55 
56  rc = zmq_disconnect (sc, connectEndpoint);
57  assert (rc == 0);
58  rc = zmq_unbind (sb, bindEndpoint);
59  assert (rc == 0);
60 
61  rc = zmq_close (sc);
62  assert (rc == 0);
63  rc = zmq_close (sb);
64  assert (rc == 0);
65 
66  /* Address wildcard, IPv6 enabled */
67  sb = zmq_socket (ctx, ZMQ_REP);
68  assert (sb);
69  sc = zmq_socket (ctx, ZMQ_REQ);
70  assert (sc);
71 
72  rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int));
73  assert (rc == 0);
74  rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int));
75  assert (rc == 0);
76 
77  rc = zmq_bind (sb, "tcp://*:5556");
78  assert (rc == 0);
79 
80  endpoint_len = sizeof (bindEndpoint);
81  memset(bindEndpoint, 0, endpoint_len);
82  rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bindEndpoint, &endpoint_len);
83  assert (rc == 0);
84 
85 #ifdef ZMQ_HAVE_WINDOWS
86  if (ipv6)
87  strcpy(connectEndpoint, "tcp://[::1]:5556");
88  else
89  strcpy(connectEndpoint, "tcp://127.0.0.1:5556");
90 #else
91  strcpy(connectEndpoint, bindEndpoint);
92 #endif
93 
94  rc = zmq_connect (sc, connectEndpoint);
95  assert (rc == 0);
96 
97  bounce (sb, sc);
98 
99  rc = zmq_disconnect (sc, connectEndpoint);
100  assert (rc == 0);
101  rc = zmq_unbind (sb, bindEndpoint);
102  assert (rc == 0);
103 
104  rc = zmq_close (sc);
105  assert (rc == 0);
106  rc = zmq_close (sb);
107  assert (rc == 0);
108 
109  /* Port wildcard, IPv4 address, IPv6 disabled */
110  sb = zmq_socket (ctx, ZMQ_REP);
111  assert (sb);
112  sc = zmq_socket (ctx, ZMQ_REQ);
113  assert (sc);
114 
115  rc = zmq_bind (sb, "tcp://127.0.0.1:*");
116  assert (rc == 0);
117 
118  char endpoint[256];
119  endpoint_len = sizeof (endpoint);
120  memset(endpoint, 0, endpoint_len);
121  rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len);
122  assert (rc == 0);
123 
124  rc = zmq_connect (sc, endpoint);
125  assert (rc == 0);
126 
127  bounce (sb, sc);
128 
129  rc = zmq_disconnect (sc, endpoint);
130  assert (rc == 0);
131  rc = zmq_unbind (sb, endpoint);
132  assert (rc == 0);
133 
134  rc = zmq_close (sc);
135  assert (rc == 0);
136  rc = zmq_close (sb);
137  assert (rc == 0);
138 
139  /* Port wildcard, IPv4 address, IPv6 enabled */
140  sb = zmq_socket (ctx, ZMQ_REP);
141  assert (sb);
142  sc = zmq_socket (ctx, ZMQ_REQ);
143  assert (sc);
144 
145  rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int));
146  assert (rc == 0);
147  rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int));
148  assert (rc == 0);
149 
150  rc = zmq_bind (sb, "tcp://127.0.0.1:*");
151  assert (rc == 0);
152 
153  endpoint_len = sizeof (endpoint);
154  memset(endpoint, 0, endpoint_len);
155  rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len);
156  assert (rc == 0);
157 
158  rc = zmq_connect (sc, endpoint);
159  assert (rc == 0);
160 
161  bounce (sb, sc);
162 
163  rc = zmq_disconnect (sc, endpoint);
164  assert (rc == 0);
165  rc = zmq_unbind (sb, endpoint);
166  assert (rc == 0);
167 
168  rc = zmq_close (sc);
169  assert (rc == 0);
170  rc = zmq_close (sb);
171  assert (rc == 0);
172 
173  if (ipv6) {
174  /* Port wildcard, IPv6 address, IPv6 enabled */
175  sb = zmq_socket (ctx, ZMQ_REP);
176  assert (sb);
177  sc = zmq_socket (ctx, ZMQ_REQ);
178  assert (sc);
179 
180  rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int));
181  assert (rc == 0);
182  rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int));
183  assert (rc == 0);
184 
185  rc = zmq_bind (sb, "tcp://[::1]:*");
186  assert (rc == 0);
187 
188  endpoint_len = sizeof (endpoint);
189  memset(endpoint, 0, endpoint_len);
190  rc = zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len);
191  assert (rc == 0);
192 
193  rc = zmq_connect (sc, endpoint);
194  assert (rc == 0);
195 
196  bounce (sb, sc);
197 
198  rc = zmq_disconnect (sc, endpoint);
199  assert (rc == 0);
200  rc = zmq_unbind (sb, endpoint);
201  assert (rc == 0);
202 
203  rc = zmq_close (sc);
204  assert (rc == 0);
205  rc = zmq_close (sb);
206  assert (rc == 0);
207  }
208 
209  /* No wildcard, IPv4 address, IPv6 disabled */
210  sb = zmq_socket (ctx, ZMQ_REP);
211  assert (sb);
212  sc = zmq_socket (ctx, ZMQ_REQ);
213  assert (sc);
214 
215  rc = zmq_bind (sb, "tcp://127.0.0.1:5557");
216  assert (rc == 0);
217  rc = zmq_connect (sc, "tcp://127.0.0.1:5557");
218  assert (rc == 0);
219 
220  bounce (sb, sc);
221 
222  rc = zmq_disconnect (sc, "tcp://127.0.0.1:5557");
223  assert (rc == 0);
224  rc = zmq_unbind (sb, "tcp://127.0.0.1:5557");
225  assert (rc == 0);
226 
227  rc = zmq_close (sc);
228  assert (rc == 0);
229  rc = zmq_close (sb);
230  assert (rc == 0);
231 
232  /* No wildcard, IPv4 address, IPv6 enabled */
233  sb = zmq_socket (ctx, ZMQ_REP);
234  assert (sb);
235  sc = zmq_socket (ctx, ZMQ_REQ);
236  assert (sc);
237 
238  rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int));
239  assert (rc == 0);
240  rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int));
241  assert (rc == 0);
242 
243  rc = zmq_bind (sb, "tcp://127.0.0.1:5558");
244  assert (rc == 0);
245  rc = zmq_connect (sc, "tcp://127.0.0.1:5558");
246  assert (rc == 0);
247 
248  bounce (sb, sc);
249 
250  rc = zmq_disconnect (sc, "tcp://127.0.0.1:5558");
251  assert (rc == 0);
252  rc = zmq_unbind (sb, "tcp://127.0.0.1:5558");
253  assert (rc == 0);
254 
255  rc = zmq_close (sc);
256  assert (rc == 0);
257  rc = zmq_close (sb);
258  assert (rc == 0);
259 
260  if (ipv6) {
261  /* No wildcard, IPv6 address, IPv6 enabled */
262  sb = zmq_socket (ctx, ZMQ_REP);
263  assert (sb);
264  sc = zmq_socket (ctx, ZMQ_REQ);
265  assert (sc);
266 
267  rc = zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int));
268  assert (rc == 0);
269  rc = zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int));
270  assert (rc == 0);
271 
272  rc = zmq_bind (sb, "tcp://[::1]:5559");
273  assert (rc == 0);
274  rc = zmq_connect (sc, "tcp://[::1]:5559");
275  assert (rc == 0);
276 
277  bounce (sb, sc);
278 
279  rc = zmq_disconnect (sc, "tcp://[::1]:5559");
280  assert (rc == 0);
281  rc = zmq_unbind (sb, "tcp://[::1]:5559");
282  assert (rc == 0);
283 
284  rc = zmq_close (sc);
285  assert (rc == 0);
286  rc = zmq_close (sb);
287  assert (rc == 0);
288  }
289 
290  rc = zmq_ctx_term (ctx);
291  assert (rc == 0);
292 
293  return 0;
294 }
ZMQ_EXPORT int zmq_setsockopt(void *s, int option, const void *optval, size_t optvallen)
Definition: zmq.cpp:265
ZMQ_EXPORT int zmq_unbind(void *s, const char *addr)
Definition: zmq.cpp:343
#define ZMQ_LAST_ENDPOINT
Definition: zmq.h:286
ZMQ_EXPORT void * zmq_ctx_new(void)
Definition: zmq.cpp:115
#define ZMQ_REP
Definition: zmq.h:250
int is_ipv6_available(void)
Definition: testutil.hpp:328
void setup_test_environment(void)
Definition: testutil.hpp:285
#define ZMQ_IPV6
Definition: zmq.h:295
ZMQ_EXPORT void * zmq_socket(void *, int type)
Definition: zmq.cpp:244
ZMQ_EXPORT int zmq_getsockopt(void *s, int option, void *optval, size_t *optvallen)
Definition: zmq.cpp:277
#define ZMQ_REQ
Definition: zmq.h:249
ZMQ_EXPORT int zmq_connect(void *s, const char *addr)
Definition: zmq.cpp:332
ZMQ_EXPORT int zmq_close(void *s)
Definition: zmq.cpp:255
void bounce(void *server, void *client)
Definition: testutil.hpp:73
ZMQ_EXPORT int zmq_bind(void *s, const char *addr)
Definition: zmq.cpp:321
ZMQ_EXPORT int zmq_ctx_term(void *context)
Definition: zmq.cpp:162
int main(void)
ZMQ_EXPORT int zmq_disconnect(void *s, const char *addr)
Definition: zmq.cpp:353