zmq.hpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2016-2017 ZeroMQ community
3  Copyright (c) 2009-2011 250bpm s.r.o.
4  Copyright (c) 2011 Botond Ballo
5  Copyright (c) 2007-2009 iMatix Corporation
6 
7  Permission is hereby granted, free of charge, to any person obtaining a copy
8  of this software and associated documentation files (the "Software"), to
9  deal in the Software without restriction, including without limitation the
10  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
11  sell copies of the Software, and to permit persons to whom the Software is
12  furnished to do so, subject to the following conditions:
13 
14  The above copyright notice and this permission notice shall be included in
15  all copies or substantial portions of the Software.
16 
17  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23  IN THE SOFTWARE.
24 */
25 
26 #ifndef __ZMQ_HPP_INCLUDED__
27 #define __ZMQ_HPP_INCLUDED__
28 
29 #ifdef _WIN32
30 #ifndef NOMINMAX
31 #define NOMINMAX
32 #endif
33 #endif
34 
35 // included here for _HAS_CXX* macros
36 #include <zmq.h>
37 
38 #if defined(_MSVC_LANG)
39 #define CPPZMQ_LANG _MSVC_LANG
40 #else
41 #define CPPZMQ_LANG __cplusplus
42 #endif
43 // overwrite if specific language macros indicate higher version
44 #if defined(_HAS_CXX14) && _HAS_CXX14 && CPPZMQ_LANG < 201402L
45 #undef CPPZMQ_LANG
46 #define CPPZMQ_LANG 201402L
47 #endif
48 #if defined(_HAS_CXX17) && _HAS_CXX17 && CPPZMQ_LANG < 201703L
49 #undef CPPZMQ_LANG
50 #define CPPZMQ_LANG 201703L
51 #endif
52 
53 // macros defined if has a specific standard or greater
54 #if CPPZMQ_LANG >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
55 #define ZMQ_CPP11
56 #endif
57 #if CPPZMQ_LANG >= 201402L
58 #define ZMQ_CPP14
59 #endif
60 #if CPPZMQ_LANG >= 201703L
61 #define ZMQ_CPP17
62 #endif
63 
64 #if defined(ZMQ_CPP14) && !defined(_MSC_VER)
65 #define ZMQ_DEPRECATED(msg) [[deprecated(msg)]]
66 #elif defined(_MSC_VER)
67 #define ZMQ_DEPRECATED(msg) __declspec(deprecated(msg))
68 #elif defined(__GNUC__)
69 #define ZMQ_DEPRECATED(msg) __attribute__((deprecated(msg)))
70 #else
71 #define ZMQ_DEPRECATED(msg)
72 #endif
73 
74 #if defined(ZMQ_CPP17)
75 #define ZMQ_NODISCARD [[nodiscard]]
76 #else
77 #define ZMQ_NODISCARD
78 #endif
79 
80 #if defined(ZMQ_CPP11)
81 #define ZMQ_NOTHROW noexcept
82 #define ZMQ_EXPLICIT explicit
83 #define ZMQ_OVERRIDE override
84 #define ZMQ_NULLPTR nullptr
85 #define ZMQ_CONSTEXPR_FN constexpr
86 #define ZMQ_CONSTEXPR_VAR constexpr
87 #define ZMQ_CPP11_DEPRECATED(msg) ZMQ_DEPRECATED(msg)
88 #else
89 #define ZMQ_NOTHROW throw()
90 #define ZMQ_EXPLICIT
91 #define ZMQ_OVERRIDE
92 #define ZMQ_NULLPTR 0
93 #define ZMQ_CONSTEXPR_FN
94 #define ZMQ_CONSTEXPR_VAR const
95 #define ZMQ_CPP11_DEPRECATED(msg)
96 #endif
97 #if defined(ZMQ_CPP14) && (!defined(_MSC_VER) || _MSC_VER > 1900) && (!defined(__GNUC__) || __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ > 3))
98 #define ZMQ_EXTENDED_CONSTEXPR
99 #endif
100 #if defined(ZMQ_CPP17)
101 #define ZMQ_INLINE_VAR inline
102 #define ZMQ_CONSTEXPR_IF constexpr
103 #else
104 #define ZMQ_INLINE_VAR
105 #define ZMQ_CONSTEXPR_IF
106 #endif
107 
108 #include <cassert>
109 #include <cstring>
110 
111 #include <type_traits>
112 #include <algorithm>
113 #include <exception>
114 #include <iomanip>
115 #include <sstream>
116 #include <string>
117 #include <vector>
118 #ifdef ZMQ_CPP11
119 #include <array>
120 #include <chrono>
121 #include <tuple>
122 #include <memory>
123 #endif
124 
125 #if defined(__has_include) && defined(ZMQ_CPP17)
126 #define CPPZMQ_HAS_INCLUDE_CPP17(X) __has_include(X)
127 #else
128 #define CPPZMQ_HAS_INCLUDE_CPP17(X) 0
129 #endif
130 
131 #if CPPZMQ_HAS_INCLUDE_CPP17(<optional>) && !defined(CPPZMQ_HAS_OPTIONAL)
132 #define CPPZMQ_HAS_OPTIONAL 1
133 #endif
134 #ifndef CPPZMQ_HAS_OPTIONAL
135 #define CPPZMQ_HAS_OPTIONAL 0
136 #elif CPPZMQ_HAS_OPTIONAL
137 #include <optional>
138 #endif
139 
140 #if CPPZMQ_HAS_INCLUDE_CPP17(<string_view>) && !defined(CPPZMQ_HAS_STRING_VIEW)
141 #define CPPZMQ_HAS_STRING_VIEW 1
142 #endif
143 #ifndef CPPZMQ_HAS_STRING_VIEW
144 #define CPPZMQ_HAS_STRING_VIEW 0
145 #elif CPPZMQ_HAS_STRING_VIEW
146 #include <string_view>
147 #endif
148 
149 /* Version macros for compile-time API version detection */
150 #define CPPZMQ_VERSION_MAJOR 4
151 #define CPPZMQ_VERSION_MINOR 10
152 #define CPPZMQ_VERSION_PATCH 0
153 
154 #define CPPZMQ_VERSION \
155  ZMQ_MAKE_VERSION(CPPZMQ_VERSION_MAJOR, CPPZMQ_VERSION_MINOR, \
156  CPPZMQ_VERSION_PATCH)
157 
158 // Detect whether the compiler supports C++11 rvalue references.
159 #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) \
160  && defined(__GXX_EXPERIMENTAL_CXX0X__))
161 #define ZMQ_HAS_RVALUE_REFS
162 #define ZMQ_DELETED_FUNCTION = delete
163 #elif defined(__clang__)
164 #if __has_feature(cxx_rvalue_references)
165 #define ZMQ_HAS_RVALUE_REFS
166 #endif
167 
168 #if __has_feature(cxx_deleted_functions)
169 #define ZMQ_DELETED_FUNCTION = delete
170 #else
171 #define ZMQ_DELETED_FUNCTION
172 #endif
173 #elif defined(_MSC_VER) && (_MSC_VER >= 1900)
174 #define ZMQ_HAS_RVALUE_REFS
175 #define ZMQ_DELETED_FUNCTION = delete
176 #elif defined(_MSC_VER) && (_MSC_VER >= 1600)
177 #define ZMQ_HAS_RVALUE_REFS
178 #define ZMQ_DELETED_FUNCTION
179 #else
180 #define ZMQ_DELETED_FUNCTION
181 #endif
182 
183 #if defined(ZMQ_CPP11) && !defined(__llvm__) && !defined(__INTEL_COMPILER) \
184  && defined(__GNUC__) && __GNUC__ < 5
185 #define ZMQ_CPP11_PARTIAL
186 #elif defined(__GLIBCXX__) && __GLIBCXX__ < 20160805
187 //the date here is the last date of gcc 4.9.4, which
188 // effectively means libstdc++ from gcc 5.5 and higher won't trigger this branch
189 #define ZMQ_CPP11_PARTIAL
190 #endif
191 
192 #ifdef ZMQ_CPP11
193 #ifdef ZMQ_CPP11_PARTIAL
194 #define ZMQ_IS_TRIVIALLY_COPYABLE(T) __has_trivial_copy(T)
195 #else
196 #include <type_traits>
197 #define ZMQ_IS_TRIVIALLY_COPYABLE(T) std::is_trivially_copyable<T>::value
198 #endif
199 #endif
200 
201 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3, 3, 0)
202 #define ZMQ_NEW_MONITOR_EVENT_LAYOUT
203 #endif
204 
205 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 1, 0)
206 #define ZMQ_HAS_PROXY_STEERABLE
207 /* Socket event data */
208 typedef struct
209 {
210  uint16_t event; // id of the event as bitfield
211  int32_t value; // value is either error code, fd or reconnect interval
212 } zmq_event_t;
213 #endif
214 
215 // Avoid using deprecated message receive function when possible
216 #if ZMQ_VERSION < ZMQ_MAKE_VERSION(3, 2, 0)
217 #define zmq_msg_recv(msg, socket, flags) zmq_recvmsg(socket, msg, flags)
218 #endif
219 
220 
221 // In order to prevent unused variable warnings when building in non-debug
222 // mode use this macro to make assertions.
223 #ifndef NDEBUG
224 #define ZMQ_ASSERT(expression) assert(expression)
225 #else
226 #define ZMQ_ASSERT(expression) (void) (expression)
227 #endif
228 
229 namespace zmq
230 {
231 #ifdef ZMQ_CPP11
232 namespace detail
233 {
234 namespace ranges
235 {
236 using std::begin;
237 using std::end;
238 template<class T> auto begin(T &&r) -> decltype(begin(std::forward<T>(r)))
239 {
240  return begin(std::forward<T>(r));
241 }
242 template<class T> auto end(T &&r) -> decltype(end(std::forward<T>(r)))
243 {
244  return end(std::forward<T>(r));
245 }
246 } // namespace ranges
247 
248 template<class T> using void_t = void;
249 
250 template<class Iter>
251 using iter_value_t = typename std::iterator_traits<Iter>::value_type;
252 
253 template<class Range>
254 using range_iter_t = decltype(
255  ranges::begin(std::declval<typename std::remove_reference<Range>::type &>()));
256 
257 template<class Range> using range_value_t = iter_value_t<range_iter_t<Range>>;
258 
259 template<class T, class = void> struct is_range : std::false_type
260 {
261 };
262 
263 template<class T>
264 struct is_range<
265  T,
266  void_t<decltype(
267  ranges::begin(std::declval<typename std::remove_reference<T>::type &>())
268  == ranges::end(std::declval<typename std::remove_reference<T>::type &>()))>>
270 {
271 };
272 
273 } // namespace detail
274 #endif
275 
278 
279 // duplicate definition from libzmq 4.3.3
280 #if defined _WIN32
281 #if defined _WIN64
282 typedef unsigned __int64 fd_t;
283 #else
284 typedef unsigned int fd_t;
285 #endif
286 #else
287 typedef int fd_t;
288 #endif
289 
290 class error_t : public std::exception
291 {
292  public:
294  explicit error_t(int err) ZMQ_NOTHROW : errnum(err) {}
295  virtual const char *what() const ZMQ_NOTHROW ZMQ_OVERRIDE
296  {
297  return zmq_strerror(errnum);
298  }
299  int num() const ZMQ_NOTHROW { return errnum; }
300 
301  private:
302  int errnum;
303 };
304 
305 namespace detail {
306 inline int poll(zmq_pollitem_t *items_, size_t nitems_, long timeout_)
307 {
308  int rc = zmq_poll(items_, static_cast<int>(nitems_), timeout_);
309  if (rc < 0)
310  throw error_t();
311  return rc;
312 }
313 }
314 
315 #ifdef ZMQ_CPP11
316 ZMQ_DEPRECATED("from 4.8.0, use poll taking std::chrono::duration instead of long")
317 inline int poll(zmq_pollitem_t *items_, size_t nitems_, long timeout_)
318 #else
319 inline int poll(zmq_pollitem_t *items_, size_t nitems_, long timeout_ = -1)
320 #endif
321 {
322  return detail::poll(items_, nitems_, timeout_);
323 }
324 
325 ZMQ_DEPRECATED("from 4.3.1, use poll taking non-const items")
326 inline int poll(zmq_pollitem_t const *items_, size_t nitems_, long timeout_ = -1)
327 {
328  return detail::poll(const_cast<zmq_pollitem_t *>(items_), nitems_, timeout_);
329 }
330 
331 #ifdef ZMQ_CPP11
332 ZMQ_DEPRECATED("from 4.3.1, use poll taking non-const items")
333 inline int
334 poll(zmq_pollitem_t const *items, size_t nitems, std::chrono::milliseconds timeout)
335 {
336  return detail::poll(const_cast<zmq_pollitem_t *>(items), nitems,
337  static_cast<long>(timeout.count()));
338 }
339 
340 ZMQ_DEPRECATED("from 4.3.1, use poll taking non-const items")
341 inline int poll(std::vector<zmq_pollitem_t> const &items,
342  std::chrono::milliseconds timeout)
343 {
344  return detail::poll(const_cast<zmq_pollitem_t *>(items.data()), items.size(),
345  static_cast<long>(timeout.count()));
346 }
347 
348 ZMQ_DEPRECATED("from 4.3.1, use poll taking non-const items")
349 inline int poll(std::vector<zmq_pollitem_t> const &items, long timeout_ = -1)
350 {
351  return detail::poll(const_cast<zmq_pollitem_t *>(items.data()), items.size(), timeout_);
352 }
353 
354 inline int
355 poll(zmq_pollitem_t *items, size_t nitems, std::chrono::milliseconds timeout = std::chrono::milliseconds{-1})
356 {
357  return detail::poll(items, nitems, static_cast<long>(timeout.count()));
358 }
359 
360 inline int poll(std::vector<zmq_pollitem_t> &items,
361  std::chrono::milliseconds timeout = std::chrono::milliseconds{-1})
362 {
363  return detail::poll(items.data(), items.size(), static_cast<long>(timeout.count()));
364 }
365 
366 ZMQ_DEPRECATED("from 4.3.1, use poll taking std::chrono::duration instead of long")
367 inline int poll(std::vector<zmq_pollitem_t> &items, long timeout_)
368 {
369  return detail::poll(items.data(), items.size(), timeout_);
370 }
371 
372 template<std::size_t SIZE>
373 inline int poll(std::array<zmq_pollitem_t, SIZE> &items,
374  std::chrono::milliseconds timeout = std::chrono::milliseconds{-1})
375 {
376  return detail::poll(items.data(), items.size(), static_cast<long>(timeout.count()));
377 }
378 #endif
379 
380 
381 inline void version(int *major_, int *minor_, int *patch_)
382 {
383  zmq_version(major_, minor_, patch_);
384 }
385 
386 #ifdef ZMQ_CPP11
387 inline std::tuple<int, int, int> version()
388 {
389  std::tuple<int, int, int> v;
390  zmq_version(&std::get<0>(v), &std::get<1>(v), &std::get<2>(v));
391  return v;
392 }
393 
394 #if !defined(ZMQ_CPP11_PARTIAL)
395 namespace detail
396 {
397 template<class T> struct is_char_type
398 {
399  // true if character type for string literals in C++11
400  static constexpr bool value =
403 };
404 }
405 #endif
406 
407 #endif
408 
410 {
411  public:
413  {
414  int rc = zmq_msg_init(&msg);
415  ZMQ_ASSERT(rc == 0);
416  }
417 
418  explicit message_t(size_t size_)
419  {
420  int rc = zmq_msg_init_size(&msg, size_);
421  if (rc != 0)
422  throw error_t();
423  }
424 
425  template<class ForwardIter> message_t(ForwardIter first, ForwardIter last)
426  {
427  typedef typename std::iterator_traits<ForwardIter>::value_type value_t;
428 
429  assert(std::distance(first, last) >= 0);
430  size_t const size_ =
431  static_cast<size_t>(std::distance(first, last)) * sizeof(value_t);
432  int const rc = zmq_msg_init_size(&msg, size_);
433  if (rc != 0)
434  throw error_t();
435  std::copy(first, last, data<value_t>());
436  }
437 
438  message_t(const void *data_, size_t size_)
439  {
440  int rc = zmq_msg_init_size(&msg, size_);
441  if (rc != 0)
442  throw error_t();
443  if (size_) {
444  // this constructor allows (nullptr, 0),
445  // memcpy with a null pointer is UB
446  memcpy(data(), data_, size_);
447  }
448  }
449 
450  message_t(void *data_, size_t size_, free_fn *ffn_, void *hint_ = ZMQ_NULLPTR)
451  {
452  int rc = zmq_msg_init_data(&msg, data_, size_, ffn_, hint_);
453  if (rc != 0)
454  throw error_t();
455  }
456 
457  // overload set of string-like types and generic containers
458 #if defined(ZMQ_CPP11) && !defined(ZMQ_CPP11_PARTIAL)
459  // NOTE this constructor will include the null terminator
460  // when called with a string literal.
461  // An overload taking const char* can not be added because
462  // it would be preferred over this function and break compatiblity.
463  template<
464  class Char,
465  size_t N,
467  ZMQ_DEPRECATED("from 4.7.0, use constructors taking iterators, (pointer, size) "
468  "or strings instead")
469  explicit message_t(const Char (&data)[N]) :
470  message_t(detail::ranges::begin(data), detail::ranges::end(data))
471  {
472  }
473 
474  template<class Range,
475  typename = typename std::enable_if<
477  && ZMQ_IS_TRIVIALLY_COPYABLE(detail::range_value_t<Range>)
478  && !detail::is_char_type<detail::range_value_t<Range>>::value
480  explicit message_t(const Range &rng) :
481  message_t(detail::ranges::begin(rng), detail::ranges::end(rng))
482  {
483  }
484 
485  explicit message_t(const std::string &str) : message_t(str.data(), str.size()) {}
486 
487 #if CPPZMQ_HAS_STRING_VIEW
488  explicit message_t(std::string_view str) : message_t(str.data(), str.size()) {}
489 #endif
490 
491 #endif
492 
493 #ifdef ZMQ_HAS_RVALUE_REFS
494  message_t(message_t &&rhs) ZMQ_NOTHROW : msg(rhs.msg)
495  {
496  int rc = zmq_msg_init(&rhs.msg);
497  ZMQ_ASSERT(rc == 0);
498  }
499 
501  {
502  std::swap(msg, rhs.msg);
503  return *this;
504  }
505 #endif
506 
508  {
509  int rc = zmq_msg_close(&msg);
510  ZMQ_ASSERT(rc == 0);
511  }
512 
513  void rebuild()
514  {
515  int rc = zmq_msg_close(&msg);
516  if (rc != 0)
517  throw error_t();
518  rc = zmq_msg_init(&msg);
519  ZMQ_ASSERT(rc == 0);
520  }
521 
522  void rebuild(size_t size_)
523  {
524  int rc = zmq_msg_close(&msg);
525  if (rc != 0)
526  throw error_t();
527  rc = zmq_msg_init_size(&msg, size_);
528  if (rc != 0)
529  throw error_t();
530  }
531 
532  void rebuild(const void *data_, size_t size_)
533  {
534  int rc = zmq_msg_close(&msg);
535  if (rc != 0)
536  throw error_t();
537  rc = zmq_msg_init_size(&msg, size_);
538  if (rc != 0)
539  throw error_t();
540  memcpy(data(), data_, size_);
541  }
542 
543  void rebuild(const std::string &str)
544  {
545  rebuild(str.data(), str.size());
546  }
547 
548  void rebuild(void *data_, size_t size_, free_fn *ffn_, void *hint_ = ZMQ_NULLPTR)
549  {
550  int rc = zmq_msg_close(&msg);
551  if (rc != 0)
552  throw error_t();
553  rc = zmq_msg_init_data(&msg, data_, size_, ffn_, hint_);
554  if (rc != 0)
555  throw error_t();
556  }
557 
558  ZMQ_DEPRECATED("from 4.3.1, use move taking non-const reference instead")
560  {
561  int rc = zmq_msg_move(&msg, const_cast<zmq_msg_t *>(msg_->handle()));
562  if (rc != 0)
563  throw error_t();
564  }
565 
566  void move(message_t &msg_)
567  {
568  int rc = zmq_msg_move(&msg, msg_.handle());
569  if (rc != 0)
570  throw error_t();
571  }
572 
573  ZMQ_DEPRECATED("from 4.3.1, use copy taking non-const reference instead")
575  {
576  int rc = zmq_msg_copy(&msg, const_cast<zmq_msg_t *>(msg_->handle()));
577  if (rc != 0)
578  throw error_t();
579  }
580 
581  void copy(message_t &msg_)
582  {
583  int rc = zmq_msg_copy(&msg, msg_.handle());
584  if (rc != 0)
585  throw error_t();
586  }
587 
589  {
590  int rc = zmq_msg_more(const_cast<zmq_msg_t *>(&msg));
591  return rc != 0;
592  }
593 
594  void *data() ZMQ_NOTHROW { return zmq_msg_data(&msg); }
595 
596  const void *data() const ZMQ_NOTHROW
597  {
598  return zmq_msg_data(const_cast<zmq_msg_t *>(&msg));
599  }
600 
602  {
603  return zmq_msg_size(const_cast<zmq_msg_t *>(&msg));
604  }
605 
606  ZMQ_NODISCARD bool empty() const ZMQ_NOTHROW { return size() == 0u; }
607 
608  template<typename T> T *data() ZMQ_NOTHROW { return static_cast<T *>(data()); }
609 
610  template<typename T> T const *data() const ZMQ_NOTHROW
611  {
612  return static_cast<T const *>(data());
613  }
614 
615  ZMQ_DEPRECATED("from 4.3.0, use operator== instead")
616  bool equal(const message_t *other) const ZMQ_NOTHROW { return *this == *other; }
617 
618  bool operator==(const message_t &other) const ZMQ_NOTHROW
619  {
620  const size_t my_size = size();
621  return my_size == other.size() && 0 == memcmp(data(), other.data(), my_size);
622  }
623 
624  bool operator!=(const message_t &other) const ZMQ_NOTHROW
625  {
626  return !(*this == other);
627  }
628 
629 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3, 2, 0)
630  int get(int property_)
631  {
632  int value = zmq_msg_get(&msg, property_);
633  if (value == -1)
634  throw error_t();
635  return value;
636  }
637 #endif
638 
639 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 1, 0)
640  const char *gets(const char *property_)
641  {
642  const char *value = zmq_msg_gets(&msg, property_);
643  if (value == ZMQ_NULLPTR)
644  throw error_t();
645  return value;
646  }
647 #endif
648 
649 #if defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 0)
650  uint32_t routing_id() const
651  {
652  return zmq_msg_routing_id(const_cast<zmq_msg_t *>(&msg));
653  }
654 
655  void set_routing_id(uint32_t routing_id)
656  {
657  int rc = zmq_msg_set_routing_id(&msg, routing_id);
658  if (rc != 0)
659  throw error_t();
660  }
661 
662  const char *group() const
663  {
664  return zmq_msg_group(const_cast<zmq_msg_t *>(&msg));
665  }
666 
667  void set_group(const char *group)
668  {
669  int rc = zmq_msg_set_group(&msg, group);
670  if (rc != 0)
671  throw error_t();
672  }
673 #endif
674 
675  // interpret message content as a string
677  {
678  return std::string(static_cast<const char *>(data()), size());
679  }
680 #if CPPZMQ_HAS_STRING_VIEW
681  // interpret message content as a string
682  std::string_view to_string_view() const noexcept
683  {
684  return std::string_view(static_cast<const char *>(data()), size());
685  }
686 #endif
687 
694  std::string str() const
695  {
696  // Partly mutuated from the same method in zmq::multipart_t
697  std::stringstream os;
698 
699  const unsigned char *msg_data = this->data<unsigned char>();
700  unsigned char byte;
701  size_t size = this->size();
702  int is_ascii[2] = {0, 0};
703 
704  os << "zmq::message_t [size " << std::dec << std::setw(3)
705  << std::setfill('0') << size << "] (";
706  // Totally arbitrary
707  if (size >= 1000) {
708  os << "... too big to print)";
709  } else {
710  while (size--) {
711  byte = *msg_data++;
712 
713  is_ascii[1] = (byte >= 32 && byte < 127);
714  if (is_ascii[1] != is_ascii[0])
715  os << " "; // Separate text/non text
716 
717  if (is_ascii[1]) {
718  os << byte;
719  } else {
720  os << std::hex << std::uppercase << std::setw(2)
721  << std::setfill('0') << static_cast<short>(byte);
722  }
723  is_ascii[0] = is_ascii[1];
724  }
725  os << ")";
726  }
727  return os.str();
728  }
729 
731  {
732  // this assumes zmq::msg_t from libzmq is trivially relocatable
733  std::swap(msg, other.msg);
734  }
735 
738 
739  private:
740  // The underlying message
742 
743  // Disable implicit message copying, so that users won't use shared
744  // messages (less efficient) without being aware of the fact.
747 };
748 
750 {
751  a.swap(b);
752 }
753 
754 #ifdef ZMQ_CPP11
755 enum class ctxopt
756 {
757 #ifdef ZMQ_BLOCKY
758  blocky = ZMQ_BLOCKY,
759 #endif
760 #ifdef ZMQ_IO_THREADS
761  io_threads = ZMQ_IO_THREADS,
762 #endif
763 #ifdef ZMQ_THREAD_SCHED_POLICY
764  thread_sched_policy = ZMQ_THREAD_SCHED_POLICY,
765 #endif
766 #ifdef ZMQ_THREAD_PRIORITY
767  thread_priority = ZMQ_THREAD_PRIORITY,
768 #endif
769 #ifdef ZMQ_THREAD_AFFINITY_CPU_ADD
770  thread_affinity_cpu_add = ZMQ_THREAD_AFFINITY_CPU_ADD,
771 #endif
772 #ifdef ZMQ_THREAD_AFFINITY_CPU_REMOVE
773  thread_affinity_cpu_remove = ZMQ_THREAD_AFFINITY_CPU_REMOVE,
774 #endif
775 #ifdef ZMQ_THREAD_NAME_PREFIX
776  thread_name_prefix = ZMQ_THREAD_NAME_PREFIX,
777 #endif
778 #ifdef ZMQ_MAX_MSGSZ
779  max_msgsz = ZMQ_MAX_MSGSZ,
780 #endif
781 #ifdef ZMQ_ZERO_COPY_RECV
782  zero_copy_recv = ZMQ_ZERO_COPY_RECV,
783 #endif
784 #ifdef ZMQ_MAX_SOCKETS
785  max_sockets = ZMQ_MAX_SOCKETS,
786 #endif
787 #ifdef ZMQ_SOCKET_LIMIT
788  socket_limit = ZMQ_SOCKET_LIMIT,
789 #endif
790 #ifdef ZMQ_IPV6
791  ipv6 = ZMQ_IPV6,
792 #endif
793 #ifdef ZMQ_MSG_T_SIZE
794  msg_t_size = ZMQ_MSG_T_SIZE
795 #endif
796 };
797 #endif
798 
800 {
801  public:
803  {
804  ptr = zmq_ctx_new();
805  if (ptr == ZMQ_NULLPTR)
806  throw error_t();
807  }
808 
809 
810  explicit context_t(int io_threads_, int max_sockets_ = ZMQ_MAX_SOCKETS_DFLT)
811  {
812  ptr = zmq_ctx_new();
813  if (ptr == ZMQ_NULLPTR)
814  throw error_t();
815 
816  int rc = zmq_ctx_set(ptr, ZMQ_IO_THREADS, io_threads_);
817  ZMQ_ASSERT(rc == 0);
818 
819  rc = zmq_ctx_set(ptr, ZMQ_MAX_SOCKETS, max_sockets_);
820  ZMQ_ASSERT(rc == 0);
821  }
822 
823 #ifdef ZMQ_HAS_RVALUE_REFS
824  context_t(context_t &&rhs) ZMQ_NOTHROW : ptr(rhs.ptr) { rhs.ptr = ZMQ_NULLPTR; }
826  {
827  close();
828  std::swap(ptr, rhs.ptr);
829  return *this;
830  }
831 #endif
832 
834 
835  ZMQ_CPP11_DEPRECATED("from 4.7.0, use set taking zmq::ctxopt instead")
836  int setctxopt(int option_, int optval_)
837  {
838  int rc = zmq_ctx_set(ptr, option_, optval_);
839  ZMQ_ASSERT(rc == 0);
840  return rc;
841  }
842 
843  ZMQ_CPP11_DEPRECATED("from 4.7.0, use get taking zmq::ctxopt instead")
844  int getctxopt(int option_) { return zmq_ctx_get(ptr, option_); }
845 
846 #ifdef ZMQ_CPP11
847  void set(ctxopt option, int optval)
848  {
849  int rc = zmq_ctx_set(ptr, static_cast<int>(option), optval);
850  if (rc == -1)
851  throw error_t();
852  }
853 
854  ZMQ_NODISCARD int get(ctxopt option)
855  {
856  int rc = zmq_ctx_get(ptr, static_cast<int>(option));
857  // some options have a default value of -1
858  // which is unfortunate, and may result in errors
859  // that don't make sense
860  if (rc == -1)
861  throw error_t();
862  return rc;
863  }
864 #endif
865 
866  // Terminates context (see also shutdown()).
868  {
869  if (ptr == ZMQ_NULLPTR)
870  return;
871 
872  int rc;
873  do {
874  rc = zmq_ctx_term(ptr);
875  } while (rc == -1 && errno == EINTR);
876 
877  ZMQ_ASSERT(rc == 0);
878  ptr = ZMQ_NULLPTR;
879  }
880 
881  // Shutdown context in preparation for termination (close()).
882  // Causes all blocking socket operations and any further
883  // socket operations to return with ETERM.
885  {
886  if (ptr == ZMQ_NULLPTR)
887  return;
888  int rc = zmq_ctx_shutdown(ptr);
889  ZMQ_ASSERT(rc == 0);
890  }
891 
892  // Be careful with this, it's probably only useful for
893  // using the C api together with an existing C++ api.
894  // Normally you should never need to use this.
895  ZMQ_EXPLICIT operator void *() ZMQ_NOTHROW { return ptr; }
896 
897  ZMQ_EXPLICIT operator void const *() const ZMQ_NOTHROW { return ptr; }
898 
899  ZMQ_NODISCARD void *handle() ZMQ_NOTHROW { return ptr; }
900 
901  ZMQ_DEPRECATED("from 4.7.0, use handle() != nullptr instead")
902  operator bool() const ZMQ_NOTHROW { return ptr != ZMQ_NULLPTR; }
903 
904  void swap(context_t &other) ZMQ_NOTHROW { std::swap(ptr, other.ptr); }
905 
906  private:
907  void *ptr;
908 
911 };
912 
914 {
915  a.swap(b);
916 }
917 
918 #ifdef ZMQ_CPP11
919 
920 struct recv_buffer_size
921 {
922  size_t size; // number of bytes written to buffer
923  size_t untruncated_size; // untruncated message size in bytes
924 
925  ZMQ_NODISCARD bool truncated() const noexcept
926  {
927  return size != untruncated_size;
928  }
929 };
930 
931 #if CPPZMQ_HAS_OPTIONAL
932 
933 using send_result_t = std::optional<size_t>;
934 using recv_result_t = std::optional<size_t>;
935 using recv_buffer_result_t = std::optional<recv_buffer_size>;
936 
937 #else
938 
939 namespace detail
940 {
941 // A C++11 type emulating the most basic
942 // operations of std::optional for trivial types
943 template<class T> class trivial_optional
944 {
945  public:
946  static_assert(std::is_trivial<T>::value, "T must be trivial");
947  using value_type = T;
948 
949  trivial_optional() = default;
950  trivial_optional(T value) noexcept : _value(value), _has_value(true) {}
951 
952  const T *operator->() const noexcept
953  {
954  assert(_has_value);
955  return &_value;
956  }
957  T *operator->() noexcept
958  {
959  assert(_has_value);
960  return &_value;
961  }
962 
963  const T &operator*() const noexcept
964  {
965  assert(_has_value);
966  return _value;
967  }
968  T &operator*() noexcept
969  {
970  assert(_has_value);
971  return _value;
972  }
973 
974  T &value()
975  {
976  if (!_has_value)
977  throw std::exception();
978  return _value;
979  }
980  const T &value() const
981  {
982  if (!_has_value)
983  throw std::exception();
984  return _value;
985  }
986 
987  explicit operator bool() const noexcept { return _has_value; }
988  bool has_value() const noexcept { return _has_value; }
989 
990  private:
991  T _value{};
992  bool _has_value{false};
993 };
994 } // namespace detail
995 
996 using send_result_t = detail::trivial_optional<size_t>;
997 using recv_result_t = detail::trivial_optional<size_t>;
998 using recv_buffer_result_t = detail::trivial_optional<recv_buffer_size>;
999 
1000 #endif
1001 
1002 namespace detail
1003 {
1004 template<class T> constexpr T enum_bit_or(T a, T b) noexcept
1005 {
1006  static_assert(std::is_enum<T>::value, "must be enum");
1007  using U = typename std::underlying_type<T>::type;
1008  return static_cast<T>(static_cast<U>(a) | static_cast<U>(b));
1009 }
1010 template<class T> constexpr T enum_bit_and(T a, T b) noexcept
1011 {
1012  static_assert(std::is_enum<T>::value, "must be enum");
1013  using U = typename std::underlying_type<T>::type;
1014  return static_cast<T>(static_cast<U>(a) & static_cast<U>(b));
1015 }
1016 template<class T> constexpr T enum_bit_xor(T a, T b) noexcept
1017 {
1018  static_assert(std::is_enum<T>::value, "must be enum");
1019  using U = typename std::underlying_type<T>::type;
1020  return static_cast<T>(static_cast<U>(a) ^ static_cast<U>(b));
1021 }
1022 template<class T> constexpr T enum_bit_not(T a) noexcept
1023 {
1024  static_assert(std::is_enum<T>::value, "must be enum");
1025  using U = typename std::underlying_type<T>::type;
1026  return static_cast<T>(~static_cast<U>(a));
1027 }
1028 } // namespace detail
1029 
1030 // partially satisfies named requirement BitmaskType
1031 enum class send_flags : int
1032 {
1033  none = 0,
1034  dontwait = ZMQ_DONTWAIT,
1035  sndmore = ZMQ_SNDMORE
1036 };
1037 
1038 constexpr send_flags operator|(send_flags a, send_flags b) noexcept
1039 {
1040  return detail::enum_bit_or(a, b);
1041 }
1042 constexpr send_flags operator&(send_flags a, send_flags b) noexcept
1043 {
1044  return detail::enum_bit_and(a, b);
1045 }
1046 constexpr send_flags operator^(send_flags a, send_flags b) noexcept
1047 {
1048  return detail::enum_bit_xor(a, b);
1049 }
1050 constexpr send_flags operator~(send_flags a) noexcept
1051 {
1052  return detail::enum_bit_not(a);
1053 }
1054 
1055 // partially satisfies named requirement BitmaskType
1056 enum class recv_flags : int
1057 {
1058  none = 0,
1059  dontwait = ZMQ_DONTWAIT
1060 };
1061 
1062 constexpr recv_flags operator|(recv_flags a, recv_flags b) noexcept
1063 {
1064  return detail::enum_bit_or(a, b);
1065 }
1066 constexpr recv_flags operator&(recv_flags a, recv_flags b) noexcept
1067 {
1068  return detail::enum_bit_and(a, b);
1069 }
1070 constexpr recv_flags operator^(recv_flags a, recv_flags b) noexcept
1071 {
1072  return detail::enum_bit_xor(a, b);
1073 }
1074 constexpr recv_flags operator~(recv_flags a) noexcept
1075 {
1076  return detail::enum_bit_not(a);
1077 }
1078 
1079 
1080 // mutable_buffer, const_buffer and buffer are based on
1081 // the Networking TS specification, draft:
1082 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4771.pdf
1083 
1084 class mutable_buffer
1085 {
1086  public:
1087  constexpr mutable_buffer() noexcept : _data(nullptr), _size(0) {}
1088  constexpr mutable_buffer(void *p, size_t n) noexcept : _data(p), _size(n)
1089  {
1090 #ifdef ZMQ_EXTENDED_CONSTEXPR
1091  assert(p != nullptr || n == 0);
1092 #endif
1093  }
1094 
1095  constexpr void *data() const noexcept { return _data; }
1096  constexpr size_t size() const noexcept { return _size; }
1097  mutable_buffer &operator+=(size_t n) noexcept
1098  {
1099  // (std::min) is a workaround for when a min macro is defined
1100  const auto shift = (std::min)(n, _size);
1101  _data = static_cast<char *>(_data) + shift;
1102  _size -= shift;
1103  return *this;
1104  }
1105 
1106  private:
1107  void *_data;
1108  size_t _size;
1109 };
1110 
1111 inline mutable_buffer operator+(const mutable_buffer &mb, size_t n) noexcept
1112 {
1113  return mutable_buffer(static_cast<char *>(mb.data()) + (std::min)(n, mb.size()),
1114  mb.size() - (std::min)(n, mb.size()));
1115 }
1116 inline mutable_buffer operator+(size_t n, const mutable_buffer &mb) noexcept
1117 {
1118  return mb + n;
1119 }
1120 
1121 class const_buffer
1122 {
1123  public:
1124  constexpr const_buffer() noexcept : _data(nullptr), _size(0) {}
1125  constexpr const_buffer(const void *p, size_t n) noexcept : _data(p), _size(n)
1126  {
1127 #ifdef ZMQ_EXTENDED_CONSTEXPR
1128  assert(p != nullptr || n == 0);
1129 #endif
1130  }
1131  constexpr const_buffer(const mutable_buffer &mb) noexcept :
1132  _data(mb.data()), _size(mb.size())
1133  {
1134  }
1135 
1136  constexpr const void *data() const noexcept { return _data; }
1137  constexpr size_t size() const noexcept { return _size; }
1138  const_buffer &operator+=(size_t n) noexcept
1139  {
1140  const auto shift = (std::min)(n, _size);
1141  _data = static_cast<const char *>(_data) + shift;
1142  _size -= shift;
1143  return *this;
1144  }
1145 
1146  private:
1147  const void *_data;
1148  size_t _size;
1149 };
1150 
1151 inline const_buffer operator+(const const_buffer &cb, size_t n) noexcept
1152 {
1153  return const_buffer(static_cast<const char *>(cb.data())
1154  + (std::min)(n, cb.size()),
1155  cb.size() - (std::min)(n, cb.size()));
1156 }
1157 inline const_buffer operator+(size_t n, const const_buffer &cb) noexcept
1158 {
1159  return cb + n;
1160 }
1161 
1162 // buffer creation
1163 
1164 constexpr mutable_buffer buffer(void *p, size_t n) noexcept
1165 {
1166  return mutable_buffer(p, n);
1167 }
1168 constexpr const_buffer buffer(const void *p, size_t n) noexcept
1169 {
1170  return const_buffer(p, n);
1171 }
1172 constexpr mutable_buffer buffer(const mutable_buffer &mb) noexcept
1173 {
1174  return mb;
1175 }
1176 inline mutable_buffer buffer(const mutable_buffer &mb, size_t n) noexcept
1177 {
1178  return mutable_buffer(mb.data(), (std::min)(mb.size(), n));
1179 }
1180 constexpr const_buffer buffer(const const_buffer &cb) noexcept
1181 {
1182  return cb;
1183 }
1184 inline const_buffer buffer(const const_buffer &cb, size_t n) noexcept
1185 {
1186  return const_buffer(cb.data(), (std::min)(cb.size(), n));
1187 }
1188 
1189 namespace detail
1190 {
1191 template<class T> struct is_buffer
1192 {
1193  static constexpr bool value =
1195 };
1196 
1197 template<class T> struct is_pod_like
1198 {
1199  // NOTE: The networking draft N4771 section 16.11 requires
1200  // T in the buffer functions below to be
1201  // trivially copyable OR standard layout.
1202  // Here we decide to be conservative and require both.
1203  static constexpr bool value =
1204  ZMQ_IS_TRIVIALLY_COPYABLE(T) && std::is_standard_layout<T>::value;
1205 };
1206 
1207 template<class C> constexpr auto seq_size(const C &c) noexcept -> decltype(c.size())
1208 {
1209  return c.size();
1210 }
1211 template<class T, size_t N>
1212 constexpr size_t seq_size(const T (&/*array*/)[N]) noexcept
1213 {
1214  return N;
1215 }
1216 
1217 template<class Seq>
1218 auto buffer_contiguous_sequence(Seq &&seq) noexcept
1219  -> decltype(buffer(std::addressof(*std::begin(seq)), size_t{}))
1220 {
1221  using T = typename std::remove_cv<
1222  typename std::remove_reference<decltype(*std::begin(seq))>::type>::type;
1223  static_assert(detail::is_pod_like<T>::value, "T must be POD");
1224 
1225  const auto size = seq_size(seq);
1226  return buffer(size != 0u ? std::addressof(*std::begin(seq)) : nullptr,
1227  size * sizeof(T));
1228 }
1229 template<class Seq>
1230 auto buffer_contiguous_sequence(Seq &&seq, size_t n_bytes) noexcept
1231  -> decltype(buffer_contiguous_sequence(seq))
1232 {
1233  using T = typename std::remove_cv<
1234  typename std::remove_reference<decltype(*std::begin(seq))>::type>::type;
1235  static_assert(detail::is_pod_like<T>::value, "T must be POD");
1236 
1237  const auto size = seq_size(seq);
1238  return buffer(size != 0u ? std::addressof(*std::begin(seq)) : nullptr,
1239  (std::min)(size * sizeof(T), n_bytes));
1240 }
1241 
1242 } // namespace detail
1243 
1244 // C array
1245 template<class T, size_t N> mutable_buffer buffer(T (&data)[N]) noexcept
1246 {
1247  return detail::buffer_contiguous_sequence(data);
1248 }
1249 template<class T, size_t N>
1250 mutable_buffer buffer(T (&data)[N], size_t n_bytes) noexcept
1251 {
1252  return detail::buffer_contiguous_sequence(data, n_bytes);
1253 }
1254 template<class T, size_t N> const_buffer buffer(const T (&data)[N]) noexcept
1255 {
1256  return detail::buffer_contiguous_sequence(data);
1257 }
1258 template<class T, size_t N>
1259 const_buffer buffer(const T (&data)[N], size_t n_bytes) noexcept
1260 {
1261  return detail::buffer_contiguous_sequence(data, n_bytes);
1262 }
1263 // std::array
1264 template<class T, size_t N> mutable_buffer buffer(std::array<T, N> &data) noexcept
1265 {
1266  return detail::buffer_contiguous_sequence(data);
1267 }
1268 template<class T, size_t N>
1269 mutable_buffer buffer(std::array<T, N> &data, size_t n_bytes) noexcept
1270 {
1271  return detail::buffer_contiguous_sequence(data, n_bytes);
1272 }
1273 template<class T, size_t N>
1274 const_buffer buffer(std::array<const T, N> &data) noexcept
1275 {
1276  return detail::buffer_contiguous_sequence(data);
1277 }
1278 template<class T, size_t N>
1279 const_buffer buffer(std::array<const T, N> &data, size_t n_bytes) noexcept
1280 {
1281  return detail::buffer_contiguous_sequence(data, n_bytes);
1282 }
1283 template<class T, size_t N>
1284 const_buffer buffer(const std::array<T, N> &data) noexcept
1285 {
1286  return detail::buffer_contiguous_sequence(data);
1287 }
1288 template<class T, size_t N>
1289 const_buffer buffer(const std::array<T, N> &data, size_t n_bytes) noexcept
1290 {
1291  return detail::buffer_contiguous_sequence(data, n_bytes);
1292 }
1293 // std::vector
1294 template<class T, class Allocator>
1295 mutable_buffer buffer(std::vector<T, Allocator> &data) noexcept
1296 {
1297  return detail::buffer_contiguous_sequence(data);
1298 }
1299 template<class T, class Allocator>
1300 mutable_buffer buffer(std::vector<T, Allocator> &data, size_t n_bytes) noexcept
1301 {
1302  return detail::buffer_contiguous_sequence(data, n_bytes);
1303 }
1304 template<class T, class Allocator>
1305 const_buffer buffer(const std::vector<T, Allocator> &data) noexcept
1306 {
1307  return detail::buffer_contiguous_sequence(data);
1308 }
1309 template<class T, class Allocator>
1310 const_buffer buffer(const std::vector<T, Allocator> &data, size_t n_bytes) noexcept
1311 {
1312  return detail::buffer_contiguous_sequence(data, n_bytes);
1313 }
1314 // std::basic_string
1315 template<class T, class Traits, class Allocator>
1316 mutable_buffer buffer(std::basic_string<T, Traits, Allocator> &data) noexcept
1317 {
1318  return detail::buffer_contiguous_sequence(data);
1319 }
1320 template<class T, class Traits, class Allocator>
1321 mutable_buffer buffer(std::basic_string<T, Traits, Allocator> &data,
1322  size_t n_bytes) noexcept
1323 {
1324  return detail::buffer_contiguous_sequence(data, n_bytes);
1325 }
1326 template<class T, class Traits, class Allocator>
1327 const_buffer buffer(const std::basic_string<T, Traits, Allocator> &data) noexcept
1328 {
1329  return detail::buffer_contiguous_sequence(data);
1330 }
1331 template<class T, class Traits, class Allocator>
1332 const_buffer buffer(const std::basic_string<T, Traits, Allocator> &data,
1333  size_t n_bytes) noexcept
1334 {
1335  return detail::buffer_contiguous_sequence(data, n_bytes);
1336 }
1337 
1338 #if CPPZMQ_HAS_STRING_VIEW
1339 // std::basic_string_view
1340 template<class T, class Traits>
1341 const_buffer buffer(std::basic_string_view<T, Traits> data) noexcept
1342 {
1343  return detail::buffer_contiguous_sequence(data);
1344 }
1345 template<class T, class Traits>
1346 const_buffer buffer(std::basic_string_view<T, Traits> data, size_t n_bytes) noexcept
1347 {
1348  return detail::buffer_contiguous_sequence(data, n_bytes);
1349 }
1350 #endif
1351 
1352 // Buffer for a string literal (null terminated)
1353 // where the buffer size excludes the terminating character.
1354 // Equivalent to zmq::buffer(std::string_view("...")).
1355 template<class Char, size_t N>
1356 constexpr const_buffer str_buffer(const Char (&data)[N]) noexcept
1357 {
1358  static_assert(detail::is_pod_like<Char>::value, "Char must be POD");
1359 #ifdef ZMQ_EXTENDED_CONSTEXPR
1360  assert(data[N - 1] == Char{0});
1361 #endif
1362  return const_buffer(static_cast<const Char *>(data), (N - 1) * sizeof(Char));
1363 }
1364 
1365 namespace literals
1366 {
1367 constexpr const_buffer operator"" _zbuf(const char *str, size_t len) noexcept
1368 {
1369  return const_buffer(str, len * sizeof(char));
1370 }
1371 constexpr const_buffer operator"" _zbuf(const wchar_t *str, size_t len) noexcept
1372 {
1373  return const_buffer(str, len * sizeof(wchar_t));
1374 }
1375 constexpr const_buffer operator"" _zbuf(const char16_t *str, size_t len) noexcept
1376 {
1377  return const_buffer(str, len * sizeof(char16_t));
1378 }
1379 constexpr const_buffer operator"" _zbuf(const char32_t *str, size_t len) noexcept
1380 {
1381  return const_buffer(str, len * sizeof(char32_t));
1382 }
1383 }
1384 
1385 #ifdef ZMQ_CPP11
1386 enum class socket_type : int
1387 {
1388  req = ZMQ_REQ,
1389  rep = ZMQ_REP,
1390  dealer = ZMQ_DEALER,
1391  router = ZMQ_ROUTER,
1392  pub = ZMQ_PUB,
1393  sub = ZMQ_SUB,
1394  xpub = ZMQ_XPUB,
1395  xsub = ZMQ_XSUB,
1396  push = ZMQ_PUSH,
1397  pull = ZMQ_PULL,
1398 #if defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 0)
1399  server = ZMQ_SERVER,
1400  client = ZMQ_CLIENT,
1401  radio = ZMQ_RADIO,
1402  dish = ZMQ_DISH,
1403  gather = ZMQ_GATHER,
1404  scatter = ZMQ_SCATTER,
1405  dgram = ZMQ_DGRAM,
1406 #endif
1407 #if defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 3)
1408  peer = ZMQ_PEER,
1409  channel = ZMQ_CHANNEL,
1410 #endif
1411 #if ZMQ_VERSION_MAJOR >= 4
1412  stream = ZMQ_STREAM,
1413 #endif
1414  pair = ZMQ_PAIR
1415 };
1416 #endif
1417 
1418 namespace sockopt
1419 {
1420 // There are two types of options,
1421 // integral type with known compiler time size (int, bool, int64_t, uint64_t)
1422 // and arrays with dynamic size (strings, binary data).
1423 
1424 // BoolUnit: if true accepts values of type bool (but passed as T into libzmq)
1425 template<int Opt, class T, bool BoolUnit = false> struct integral_option
1426 {
1427 };
1428 
1429 // NullTerm:
1430 // 0: binary data
1431 // 1: null-terminated string (`getsockopt` size includes null)
1432 // 2: binary (size 32) or Z85 encoder string of size 41 (null included)
1433 template<int Opt, int NullTerm = 1> struct array_option
1434 {
1435 };
1436 
1437 #define ZMQ_DEFINE_INTEGRAL_OPT(OPT, NAME, TYPE) \
1438  using NAME##_t = integral_option<OPT, TYPE, false>; \
1439  ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1440 #define ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(OPT, NAME, TYPE) \
1441  using NAME##_t = integral_option<OPT, TYPE, true>; \
1442  ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1443 #define ZMQ_DEFINE_ARRAY_OPT(OPT, NAME) \
1444  using NAME##_t = array_option<OPT>; \
1445  ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1446 #define ZMQ_DEFINE_ARRAY_OPT_BINARY(OPT, NAME) \
1447  using NAME##_t = array_option<OPT, 0>; \
1448  ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1449 #define ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(OPT, NAME) \
1450  using NAME##_t = array_option<OPT, 2>; \
1451  ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {}
1452 
1453 // deprecated, use zmq::fd_t
1454 using cppzmq_fd_t = ::zmq::fd_t;
1455 
1456 #ifdef ZMQ_AFFINITY
1457 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_AFFINITY, affinity, uint64_t);
1458 #endif
1459 #ifdef ZMQ_BACKLOG
1460 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_BACKLOG, backlog, int);
1461 #endif
1462 #ifdef ZMQ_BINDTODEVICE
1463 ZMQ_DEFINE_ARRAY_OPT_BINARY(ZMQ_BINDTODEVICE, bindtodevice);
1464 #endif
1465 #ifdef ZMQ_BUSY_POLL
1466 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_BUSY_POLL, busy_poll, int);
1467 #endif
1468 #ifdef ZMQ_CONFLATE
1469 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_CONFLATE, conflate, int);
1470 #endif
1471 #ifdef ZMQ_CONNECT_ROUTING_ID
1472 ZMQ_DEFINE_ARRAY_OPT(ZMQ_CONNECT_ROUTING_ID, connect_routing_id);
1473 #endif
1474 #ifdef ZMQ_CONNECT_TIMEOUT
1475 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_CONNECT_TIMEOUT, connect_timeout, int);
1476 #endif
1477 #ifdef ZMQ_CURVE_PUBLICKEY
1478 ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(ZMQ_CURVE_PUBLICKEY, curve_publickey);
1479 #endif
1480 #ifdef ZMQ_CURVE_SECRETKEY
1481 ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(ZMQ_CURVE_SECRETKEY, curve_secretkey);
1482 #endif
1483 #ifdef ZMQ_CURVE_SERVER
1484 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_CURVE_SERVER, curve_server, int);
1485 #endif
1486 #ifdef ZMQ_CURVE_SERVERKEY
1487 ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(ZMQ_CURVE_SERVERKEY, curve_serverkey);
1488 #endif
1489 #ifdef ZMQ_DISCONNECT_MSG
1490 ZMQ_DEFINE_ARRAY_OPT_BINARY(ZMQ_DISCONNECT_MSG, disconnect_msg);
1491 #endif
1492 #ifdef ZMQ_EVENTS
1493 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_EVENTS, events, int);
1494 #endif
1495 #ifdef ZMQ_FD
1496 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_FD, fd, ::zmq::fd_t);
1497 #endif
1498 #ifdef ZMQ_GSSAPI_PLAINTEXT
1499 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_GSSAPI_PLAINTEXT, gssapi_plaintext, int);
1500 #endif
1501 #ifdef ZMQ_GSSAPI_SERVER
1502 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_GSSAPI_SERVER, gssapi_server, int);
1503 #endif
1504 #ifdef ZMQ_GSSAPI_SERVICE_PRINCIPAL
1505 ZMQ_DEFINE_ARRAY_OPT(ZMQ_GSSAPI_SERVICE_PRINCIPAL, gssapi_service_principal);
1506 #endif
1507 #ifdef ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE
1508 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE,
1509  gssapi_service_principal_nametype,
1510  int);
1511 #endif
1512 #ifdef ZMQ_GSSAPI_PRINCIPAL
1513 ZMQ_DEFINE_ARRAY_OPT(ZMQ_GSSAPI_PRINCIPAL, gssapi_principal);
1514 #endif
1515 #ifdef ZMQ_GSSAPI_PRINCIPAL_NAMETYPE
1516 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_GSSAPI_PRINCIPAL_NAMETYPE,
1517  gssapi_principal_nametype,
1518  int);
1519 #endif
1520 #ifdef ZMQ_HANDSHAKE_IVL
1521 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HANDSHAKE_IVL, handshake_ivl, int);
1522 #endif
1523 #ifdef ZMQ_HEARTBEAT_IVL
1524 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HEARTBEAT_IVL, heartbeat_ivl, int);
1525 #endif
1526 #ifdef ZMQ_HEARTBEAT_TIMEOUT
1527 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HEARTBEAT_TIMEOUT, heartbeat_timeout, int);
1528 #endif
1529 #ifdef ZMQ_HEARTBEAT_TTL
1530 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HEARTBEAT_TTL, heartbeat_ttl, int);
1531 #endif
1532 #ifdef ZMQ_HELLO_MSG
1533 ZMQ_DEFINE_ARRAY_OPT_BINARY(ZMQ_HELLO_MSG, hello_msg);
1534 #endif
1535 #ifdef ZMQ_IMMEDIATE
1536 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_IMMEDIATE, immediate, int);
1537 #endif
1538 #ifdef ZMQ_INVERT_MATCHING
1539 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_INVERT_MATCHING, invert_matching, int);
1540 #endif
1541 #ifdef ZMQ_IPV6
1542 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_IPV6, ipv6, int);
1543 #endif
1544 #ifdef ZMQ_LAST_ENDPOINT
1545 ZMQ_DEFINE_ARRAY_OPT(ZMQ_LAST_ENDPOINT, last_endpoint);
1546 #endif
1547 #ifdef ZMQ_LINGER
1548 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_LINGER, linger, int);
1549 #endif
1550 #ifdef ZMQ_MAXMSGSIZE
1551 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MAXMSGSIZE, maxmsgsize, int64_t);
1552 #endif
1553 #ifdef ZMQ_MECHANISM
1554 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MECHANISM, mechanism, int);
1555 #endif
1556 #ifdef ZMQ_METADATA
1557 ZMQ_DEFINE_ARRAY_OPT(ZMQ_METADATA, metadata);
1558 #endif
1559 #ifdef ZMQ_MULTICAST_HOPS
1560 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MULTICAST_HOPS, multicast_hops, int);
1561 #endif
1562 #ifdef ZMQ_MULTICAST_LOOP
1563 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_MULTICAST_LOOP, multicast_loop, int);
1564 #endif
1565 #ifdef ZMQ_MULTICAST_MAXTPDU
1566 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MULTICAST_MAXTPDU, multicast_maxtpdu, int);
1567 #endif
1568 #ifdef ZMQ_ONLY_FIRST_SUBSCRIBE
1569 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_ONLY_FIRST_SUBSCRIBE, only_first_subscribe, int);
1570 #endif
1571 #ifdef ZMQ_PLAIN_SERVER
1572 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_PLAIN_SERVER, plain_server, int);
1573 #endif
1574 #ifdef ZMQ_PLAIN_PASSWORD
1575 ZMQ_DEFINE_ARRAY_OPT(ZMQ_PLAIN_PASSWORD, plain_password);
1576 #endif
1577 #ifdef ZMQ_PLAIN_USERNAME
1578 ZMQ_DEFINE_ARRAY_OPT(ZMQ_PLAIN_USERNAME, plain_username);
1579 #endif
1580 #ifdef ZMQ_PRIORITY
1581 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_PRIORITY, priority, int);
1582 #endif
1583 #ifdef ZMQ_USE_FD
1584 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_USE_FD, use_fd, int);
1585 #endif
1586 #ifdef ZMQ_PROBE_ROUTER
1587 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_PROBE_ROUTER, probe_router, int);
1588 #endif
1589 #ifdef ZMQ_RATE
1590 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RATE, rate, int);
1591 #endif
1592 #ifdef ZMQ_RCVBUF
1593 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RCVBUF, rcvbuf, int);
1594 #endif
1595 #ifdef ZMQ_RCVHWM
1596 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RCVHWM, rcvhwm, int);
1597 #endif
1598 #ifdef ZMQ_RCVMORE
1599 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_RCVMORE, rcvmore, int);
1600 #endif
1601 #ifdef ZMQ_RCVTIMEO
1602 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RCVTIMEO, rcvtimeo, int);
1603 #endif
1604 #ifdef ZMQ_RECONNECT_IVL
1605 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RECONNECT_IVL, reconnect_ivl, int);
1606 #endif
1607 #ifdef ZMQ_RECONNECT_IVL_MAX
1608 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RECONNECT_IVL_MAX, reconnect_ivl_max, int);
1609 #endif
1610 #ifdef ZMQ_RECONNECT_STOP
1611 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RECONNECT_STOP, reconnect_stop, int);
1612 #endif
1613 #ifdef ZMQ_RECOVERY_IVL
1614 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RECOVERY_IVL, recovery_ivl, int);
1615 #endif
1616 #ifdef ZMQ_REQ_CORRELATE
1617 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_REQ_CORRELATE, req_correlate, int);
1618 #endif
1619 #ifdef ZMQ_REQ_RELAXED
1620 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_REQ_RELAXED, req_relaxed, int);
1621 #endif
1622 #ifdef ZMQ_ROUTER_HANDOVER
1623 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_ROUTER_HANDOVER, router_handover, int);
1624 #endif
1625 #ifdef ZMQ_ROUTER_MANDATORY
1626 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_ROUTER_MANDATORY, router_mandatory, int);
1627 #endif
1628 #ifdef ZMQ_ROUTER_NOTIFY
1629 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_ROUTER_NOTIFY, router_notify, int);
1630 #endif
1631 #ifdef ZMQ_ROUTER_RAW
1632 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_ROUTER_RAW, router_raw, int);
1633 #endif
1634 #ifdef ZMQ_ROUTING_ID
1635 ZMQ_DEFINE_ARRAY_OPT_BINARY(ZMQ_ROUTING_ID, routing_id);
1636 #endif
1637 #ifdef ZMQ_SNDBUF
1638 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_SNDBUF, sndbuf, int);
1639 #endif
1640 #ifdef ZMQ_SNDHWM
1641 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_SNDHWM, sndhwm, int);
1642 #endif
1643 #ifdef ZMQ_SNDTIMEO
1644 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_SNDTIMEO, sndtimeo, int);
1645 #endif
1646 #ifdef ZMQ_SOCKS_PASSWORD
1647 ZMQ_DEFINE_ARRAY_OPT(ZMQ_SOCKS_PASSWORD, socks_password);
1648 #endif
1649 #ifdef ZMQ_SOCKS_PROXY
1650 ZMQ_DEFINE_ARRAY_OPT(ZMQ_SOCKS_PROXY, socks_proxy);
1651 #endif
1652 #ifdef ZMQ_SOCKS_USERNAME
1653 ZMQ_DEFINE_ARRAY_OPT(ZMQ_SOCKS_USERNAME, socks_username);
1654 #endif
1655 #ifdef ZMQ_STREAM_NOTIFY
1656 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_STREAM_NOTIFY, stream_notify, int);
1657 #endif
1658 #ifdef ZMQ_SUBSCRIBE
1659 ZMQ_DEFINE_ARRAY_OPT(ZMQ_SUBSCRIBE, subscribe);
1660 #endif
1661 #ifdef ZMQ_TCP_KEEPALIVE
1662 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE, tcp_keepalive, int);
1663 #endif
1664 #ifdef ZMQ_TCP_KEEPALIVE_CNT
1665 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE_CNT, tcp_keepalive_cnt, int);
1666 #endif
1667 #ifdef ZMQ_TCP_KEEPALIVE_IDLE
1668 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE_IDLE, tcp_keepalive_idle, int);
1669 #endif
1670 #ifdef ZMQ_TCP_KEEPALIVE_INTVL
1671 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE_INTVL, tcp_keepalive_intvl, int);
1672 #endif
1673 #ifdef ZMQ_TCP_MAXRT
1674 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_MAXRT, tcp_maxrt, int);
1675 #endif
1676 #ifdef ZMQ_THREAD_SAFE
1677 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_THREAD_SAFE, thread_safe, int);
1678 #endif
1679 #ifdef ZMQ_TOS
1680 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TOS, tos, int);
1681 #endif
1682 #ifdef ZMQ_TYPE
1683 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TYPE, type, int);
1684 #ifdef ZMQ_CPP11
1685 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TYPE, socket_type, socket_type);
1686 #endif // ZMQ_CPP11
1687 #endif // ZMQ_TYPE
1688 #ifdef ZMQ_UNSUBSCRIBE
1689 ZMQ_DEFINE_ARRAY_OPT(ZMQ_UNSUBSCRIBE, unsubscribe);
1690 #endif
1691 #ifdef ZMQ_VMCI_BUFFER_SIZE
1692 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_BUFFER_SIZE, vmci_buffer_size, uint64_t);
1693 #endif
1694 #ifdef ZMQ_VMCI_BUFFER_MIN_SIZE
1695 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_BUFFER_MIN_SIZE, vmci_buffer_min_size, uint64_t);
1696 #endif
1697 #ifdef ZMQ_VMCI_BUFFER_MAX_SIZE
1698 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_BUFFER_MAX_SIZE, vmci_buffer_max_size, uint64_t);
1699 #endif
1700 #ifdef ZMQ_VMCI_CONNECT_TIMEOUT
1701 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_CONNECT_TIMEOUT, vmci_connect_timeout, int);
1702 #endif
1703 #ifdef ZMQ_XPUB_VERBOSE
1704 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_VERBOSE, xpub_verbose, int);
1705 #endif
1706 #ifdef ZMQ_XPUB_VERBOSER
1707 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_VERBOSER, xpub_verboser, int);
1708 #endif
1709 #ifdef ZMQ_XPUB_MANUAL
1710 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_MANUAL, xpub_manual, int);
1711 #endif
1712 #ifdef ZMQ_XPUB_MANUAL_LAST_VALUE
1713 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_MANUAL_LAST_VALUE, xpub_manual_last_value, int);
1714 #endif
1715 #ifdef ZMQ_XPUB_NODROP
1716 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_NODROP, xpub_nodrop, int);
1717 #endif
1718 #ifdef ZMQ_XPUB_WELCOME_MSG
1719 ZMQ_DEFINE_ARRAY_OPT(ZMQ_XPUB_WELCOME_MSG, xpub_welcome_msg);
1720 #endif
1721 #ifdef ZMQ_ZAP_ENFORCE_DOMAIN
1722 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_ZAP_ENFORCE_DOMAIN, zap_enforce_domain, int);
1723 #endif
1724 #ifdef ZMQ_ZAP_DOMAIN
1725 ZMQ_DEFINE_ARRAY_OPT(ZMQ_ZAP_DOMAIN, zap_domain);
1726 #endif
1727 
1728 } // namespace sockopt
1729 #endif // ZMQ_CPP11
1730 
1731 
1732 namespace detail
1733 {
1735 {
1736  public:
1738  ZMQ_EXPLICIT socket_base(void *handle) ZMQ_NOTHROW : _handle(handle) {}
1739 
1740  template<typename T>
1741  ZMQ_CPP11_DEPRECATED("from 4.7.0, use `set` taking option from zmq::sockopt")
1742  void setsockopt(int option_, T const &optval)
1743  {
1744  setsockopt(option_, &optval, sizeof(T));
1745  }
1746 
1747  ZMQ_CPP11_DEPRECATED("from 4.7.0, use `set` taking option from zmq::sockopt")
1748  void setsockopt(int option_, const void *optval_, size_t optvallen_)
1749  {
1750  int rc = zmq_setsockopt(_handle, option_, optval_, optvallen_);
1751  if (rc != 0)
1752  throw error_t();
1753  }
1754 
1755  ZMQ_CPP11_DEPRECATED("from 4.7.0, use `get` taking option from zmq::sockopt")
1756  void getsockopt(int option_, void *optval_, size_t *optvallen_) const
1757  {
1758  int rc = zmq_getsockopt(_handle, option_, optval_, optvallen_);
1759  if (rc != 0)
1760  throw error_t();
1761  }
1762 
1763  template<typename T>
1764  ZMQ_CPP11_DEPRECATED("from 4.7.0, use `get` taking option from zmq::sockopt")
1765  T getsockopt(int option_) const
1766  {
1767  T optval;
1768  size_t optlen = sizeof(T);
1769  getsockopt(option_, &optval, &optlen);
1770  return optval;
1771  }
1772 
1773 #ifdef ZMQ_CPP11
1774  // Set integral socket option, e.g.
1775  // `socket.set(zmq::sockopt::linger, 0)`
1776  template<int Opt, class T, bool BoolUnit>
1777  void set(sockopt::integral_option<Opt, T, BoolUnit>, const T &val)
1778  {
1779  static_assert(std::is_integral<T>::value, "T must be integral");
1780  set_option(Opt, &val, sizeof val);
1781  }
1782 
1783  // Set integral socket option from boolean, e.g.
1784  // `socket.set(zmq::sockopt::immediate, false)`
1785  template<int Opt, class T>
1786  void set(sockopt::integral_option<Opt, T, true>, bool val)
1787  {
1788  static_assert(std::is_integral<T>::value, "T must be integral");
1789  T rep_val = val;
1790  set_option(Opt, &rep_val, sizeof rep_val);
1791  }
1792 
1793  // Set array socket option, e.g.
1794  // `socket.set(zmq::sockopt::plain_username, "foo123")`
1795  template<int Opt, int NullTerm>
1796  void set(sockopt::array_option<Opt, NullTerm>, const char *buf)
1797  {
1798  set_option(Opt, buf, std::strlen(buf));
1799  }
1800 
1801  // Set array socket option, e.g.
1802  // `socket.set(zmq::sockopt::routing_id, zmq::buffer(id))`
1803  template<int Opt, int NullTerm>
1804  void set(sockopt::array_option<Opt, NullTerm>, const_buffer buf)
1805  {
1806  set_option(Opt, buf.data(), buf.size());
1807  }
1808 
1809  // Set array socket option, e.g.
1810  // `socket.set(zmq::sockopt::routing_id, id_str)`
1811  template<int Opt, int NullTerm>
1812  void set(sockopt::array_option<Opt, NullTerm>, const std::string &buf)
1813  {
1814  set_option(Opt, buf.data(), buf.size());
1815  }
1816 
1817 #if CPPZMQ_HAS_STRING_VIEW
1818  // Set array socket option, e.g.
1819  // `socket.set(zmq::sockopt::routing_id, id_str)`
1820  template<int Opt, int NullTerm>
1821  void set(sockopt::array_option<Opt, NullTerm>, std::string_view buf)
1822  {
1823  set_option(Opt, buf.data(), buf.size());
1824  }
1825 #endif
1826 
1827  // Get scalar socket option, e.g.
1828  // `auto opt = socket.get(zmq::sockopt::linger)`
1829  template<int Opt, class T, bool BoolUnit>
1830  ZMQ_NODISCARD T get(sockopt::integral_option<Opt, T, BoolUnit>) const
1831  {
1832  static_assert(std::is_scalar<T>::value, "T must be scalar");
1833  T val;
1834  size_t size = sizeof val;
1835  get_option(Opt, &val, &size);
1836  assert(size == sizeof val);
1837  return val;
1838  }
1839 
1840  // Get array socket option, writes to buf, returns option size in bytes, e.g.
1841  // `size_t optsize = socket.get(zmq::sockopt::routing_id, zmq::buffer(id))`
1842  template<int Opt, int NullTerm>
1843  ZMQ_NODISCARD size_t get(sockopt::array_option<Opt, NullTerm>,
1844  mutable_buffer buf) const
1845  {
1846  size_t size = buf.size();
1847  get_option(Opt, buf.data(), &size);
1848  return size;
1849  }
1850 
1851  // Get array socket option as string (initializes the string buffer size to init_size) e.g.
1852  // `auto s = socket.get(zmq::sockopt::routing_id)`
1853  // Note: removes the null character from null-terminated string options,
1854  // i.e. the string size excludes the null character.
1855  template<int Opt, int NullTerm>
1856  ZMQ_NODISCARD std::string get(sockopt::array_option<Opt, NullTerm>,
1857  size_t init_size = 1024) const
1858  {
1859  if ZMQ_CONSTEXPR_IF (NullTerm == 2) {
1860  if (init_size == 1024) {
1861  init_size = 41; // get as Z85 string
1862  }
1863  }
1864  std::string str(init_size, '\0');
1865  size_t size = get(sockopt::array_option<Opt>{}, buffer(str));
1866  if ZMQ_CONSTEXPR_IF (NullTerm == 1) {
1867  if (size > 0) {
1868  assert(str[size - 1] == '\0');
1869  --size;
1870  }
1871  } else if ZMQ_CONSTEXPR_IF (NullTerm == 2) {
1872  assert(size == 32 || size == 41);
1873  if (size == 41) {
1874  assert(str[size - 1] == '\0');
1875  --size;
1876  }
1877  }
1878  str.resize(size);
1879  return str;
1880  }
1881 #endif
1882 
1883  void bind(std::string const &addr) { bind(addr.c_str()); }
1884 
1885  void bind(const char *addr_)
1886  {
1887  int rc = zmq_bind(_handle, addr_);
1888  if (rc != 0)
1889  throw error_t();
1890  }
1891 
1892  void unbind(std::string const &addr) { unbind(addr.c_str()); }
1893 
1894  void unbind(const char *addr_)
1895  {
1896  int rc = zmq_unbind(_handle, addr_);
1897  if (rc != 0)
1898  throw error_t();
1899  }
1900 
1901  void connect(std::string const &addr) { connect(addr.c_str()); }
1902 
1903  void connect(const char *addr_)
1904  {
1905  int rc = zmq_connect(_handle, addr_);
1906  if (rc != 0)
1907  throw error_t();
1908  }
1909 
1910  void disconnect(std::string const &addr) { disconnect(addr.c_str()); }
1911 
1912  void disconnect(const char *addr_)
1913  {
1914  int rc = zmq_disconnect(_handle, addr_);
1915  if (rc != 0)
1916  throw error_t();
1917  }
1918 
1919  ZMQ_DEPRECATED("from 4.7.1, use handle() != nullptr or operator bool")
1920  bool connected() const ZMQ_NOTHROW { return (_handle != ZMQ_NULLPTR); }
1921 
1922  ZMQ_CPP11_DEPRECATED("from 4.3.1, use send taking a const_buffer and send_flags")
1923  size_t send(const void *buf_, size_t len_, int flags_ = 0)
1924  {
1925  int nbytes = zmq_send(_handle, buf_, len_, flags_);
1926  if (nbytes >= 0)
1927  return static_cast<size_t>(nbytes);
1928  if (zmq_errno() == EAGAIN)
1929  return 0;
1930  throw error_t();
1931  }
1932 
1933  ZMQ_CPP11_DEPRECATED("from 4.3.1, use send taking message_t and send_flags")
1934  bool send(message_t &msg_,
1935  int flags_ = 0) // default until removed
1936  {
1937  int nbytes = zmq_msg_send(msg_.handle(), _handle, flags_);
1938  if (nbytes >= 0)
1939  return true;
1940  if (zmq_errno() == EAGAIN)
1941  return false;
1942  throw error_t();
1943  }
1944 
1945  template<typename T>
1947  "from 4.4.1, use send taking message_t or buffer (for contiguous "
1948  "ranges), and send_flags")
1949  bool send(T first, T last, int flags_ = 0)
1950  {
1951  zmq::message_t msg(first, last);
1952  int nbytes = zmq_msg_send(msg.handle(), _handle, flags_);
1953  if (nbytes >= 0)
1954  return true;
1955  if (zmq_errno() == EAGAIN)
1956  return false;
1957  throw error_t();
1958  }
1959 
1960 #ifdef ZMQ_HAS_RVALUE_REFS
1961  ZMQ_CPP11_DEPRECATED("from 4.3.1, use send taking message_t and send_flags")
1962  bool send(message_t &&msg_,
1963  int flags_ = 0) // default until removed
1964  {
1965 #ifdef ZMQ_CPP11
1966  return send(msg_, static_cast<send_flags>(flags_)).has_value();
1967 #else
1968  return send(msg_, flags_);
1969 #endif
1970  }
1971 #endif
1972 
1973 #ifdef ZMQ_CPP11
1974  send_result_t send(const_buffer buf, send_flags flags = send_flags::none)
1975  {
1976  const int nbytes =
1977  zmq_send(_handle, buf.data(), buf.size(), static_cast<int>(flags));
1978  if (nbytes >= 0)
1979  return static_cast<size_t>(nbytes);
1980  if (zmq_errno() == EAGAIN)
1981  return {};
1982  throw error_t();
1983  }
1984 
1985  send_result_t send(message_t &msg, send_flags flags)
1986  {
1987  int nbytes = zmq_msg_send(msg.handle(), _handle, static_cast<int>(flags));
1988  if (nbytes >= 0)
1989  return static_cast<size_t>(nbytes);
1990  if (zmq_errno() == EAGAIN)
1991  return {};
1992  throw error_t();
1993  }
1994 
1995  send_result_t send(message_t &&msg, send_flags flags)
1996  {
1997  return send(msg, flags);
1998  }
1999 #endif
2000 
2002  "from 4.3.1, use recv taking a mutable_buffer and recv_flags")
2003  size_t recv(void *buf_, size_t len_, int flags_ = 0)
2004  {
2005  int nbytes = zmq_recv(_handle, buf_, len_, flags_);
2006  if (nbytes >= 0)
2007  return static_cast<size_t>(nbytes);
2008  if (zmq_errno() == EAGAIN)
2009  return 0;
2010  throw error_t();
2011  }
2012 
2014  "from 4.3.1, use recv taking a reference to message_t and recv_flags")
2015  bool recv(message_t *msg_, int flags_ = 0)
2016  {
2017  int nbytes = zmq_msg_recv(msg_->handle(), _handle, flags_);
2018  if (nbytes >= 0)
2019  return true;
2020  if (zmq_errno() == EAGAIN)
2021  return false;
2022  throw error_t();
2023  }
2024 
2025 #ifdef ZMQ_CPP11
2027  recv_buffer_result_t recv(mutable_buffer buf,
2028  recv_flags flags = recv_flags::none)
2029  {
2030  const int nbytes =
2031  zmq_recv(_handle, buf.data(), buf.size(), static_cast<int>(flags));
2032  if (nbytes >= 0) {
2033  return recv_buffer_size{
2034  (std::min)(static_cast<size_t>(nbytes), buf.size()),
2035  static_cast<size_t>(nbytes)};
2036  }
2037  if (zmq_errno() == EAGAIN)
2038  return {};
2039  throw error_t();
2040  }
2041 
2043  recv_result_t recv(message_t &msg, recv_flags flags = recv_flags::none)
2044  {
2045  const int nbytes =
2046  zmq_msg_recv(msg.handle(), _handle, static_cast<int>(flags));
2047  if (nbytes >= 0) {
2048  assert(msg.size() == static_cast<size_t>(nbytes));
2049  return static_cast<size_t>(nbytes);
2050  }
2051  if (zmq_errno() == EAGAIN)
2052  return {};
2053  throw error_t();
2054  }
2055 #endif
2056 
2057 #if defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 0)
2058  void join(const char *group)
2059  {
2060  int rc = zmq_join(_handle, group);
2061  if (rc != 0)
2062  throw error_t();
2063  }
2064 
2065  void leave(const char *group)
2066  {
2067  int rc = zmq_leave(_handle, group);
2068  if (rc != 0)
2069  throw error_t();
2070  }
2071 #endif
2072 
2073  ZMQ_NODISCARD void *handle() ZMQ_NOTHROW { return _handle; }
2074  ZMQ_NODISCARD const void *handle() const ZMQ_NOTHROW { return _handle; }
2075 
2076  ZMQ_EXPLICIT operator bool() const ZMQ_NOTHROW { return _handle != ZMQ_NULLPTR; }
2077  // note: non-const operator bool can be removed once
2078  // operator void* is removed from socket_t
2079  ZMQ_EXPLICIT operator bool() ZMQ_NOTHROW { return _handle != ZMQ_NULLPTR; }
2080 
2081  protected:
2082  void *_handle;
2083 
2084  private:
2085  void set_option(int option_, const void *optval_, size_t optvallen_)
2086  {
2087  int rc = zmq_setsockopt(_handle, option_, optval_, optvallen_);
2088  if (rc != 0)
2089  throw error_t();
2090  }
2091 
2092  void get_option(int option_, void *optval_, size_t *optvallen_) const
2093  {
2094  int rc = zmq_getsockopt(_handle, option_, optval_, optvallen_);
2095  if (rc != 0)
2096  throw error_t();
2097  }
2098 };
2099 } // namespace detail
2100 
2102 {
2103  struct _private
2104  {
2105  }; // disabling use other than with from_handle
2107 };
2108 
2111 
2112 // A non-owning nullable reference to a socket.
2113 // The reference is invalidated on socket close or destruction.
2115 {
2116  public:
2118 #ifdef ZMQ_CPP11
2119  socket_ref(std::nullptr_t) ZMQ_NOTHROW : detail::socket_base() {}
2120 #endif
2121  socket_ref(from_handle_t /*fh*/, void *handle) ZMQ_NOTHROW
2122  : detail::socket_base(handle)
2123  {
2124  }
2125 };
2126 
2127 #ifdef ZMQ_CPP11
2128 inline bool operator==(socket_ref sr, std::nullptr_t /*p*/) ZMQ_NOTHROW
2129 {
2130  return sr.handle() == nullptr;
2131 }
2132 inline bool operator==(std::nullptr_t /*p*/, socket_ref sr) ZMQ_NOTHROW
2133 {
2134  return sr.handle() == nullptr;
2135 }
2136 inline bool operator!=(socket_ref sr, std::nullptr_t /*p*/) ZMQ_NOTHROW
2137 {
2138  return !(sr == nullptr);
2139 }
2140 inline bool operator!=(std::nullptr_t /*p*/, socket_ref sr) ZMQ_NOTHROW
2141 {
2142  return !(sr == nullptr);
2143 }
2144 #endif
2145 
2147 {
2148  return std::equal_to<const void *>()(a.handle(), b.handle());
2149 }
2151 {
2152  return !(a == b);
2153 }
2155 {
2156  return std::less<const void *>()(a.handle(), b.handle());
2157 }
2159 {
2160  return b < a;
2161 }
2163 {
2164  return !(a > b);
2165 }
2167 {
2168  return !(a < b);
2169 }
2170 
2171 } // namespace zmq
2172 
2173 #ifdef ZMQ_CPP11
2174 namespace std
2175 {
2176 template<> struct hash<zmq::socket_ref>
2177 {
2178  size_t operator()(zmq::socket_ref sr) const ZMQ_NOTHROW
2179  {
2180  return hash<void *>()(sr.handle());
2181  }
2182 };
2183 } // namespace std
2184 #endif
2185 
2186 namespace zmq
2187 {
2189 {
2190  friend class monitor_t;
2191 
2192  public:
2194 
2195  socket_t(context_t &context_, int type_) :
2196  detail::socket_base(zmq_socket(context_.handle(), type_)),
2197  ctxptr(context_.handle())
2198  {
2199  if (_handle == ZMQ_NULLPTR)
2200  throw error_t();
2201  }
2202 
2203 #ifdef ZMQ_CPP11
2204  socket_t(context_t &context_, socket_type type_) :
2205  socket_t(context_, static_cast<int>(type_))
2206  {
2207  }
2208 #endif
2209 
2210 #ifdef ZMQ_HAS_RVALUE_REFS
2211  socket_t(socket_t &&rhs) ZMQ_NOTHROW : detail::socket_base(rhs._handle),
2212  ctxptr(rhs.ctxptr)
2213  {
2214  rhs._handle = ZMQ_NULLPTR;
2215  rhs.ctxptr = ZMQ_NULLPTR;
2216  }
2218  {
2219  close();
2220  std::swap(_handle, rhs._handle);
2221  std::swap(ctxptr, rhs.ctxptr);
2222  return *this;
2223  }
2224 #endif
2225 
2227 
2228  operator void *() ZMQ_NOTHROW { return _handle; }
2229 
2230  operator void const *() const ZMQ_NOTHROW { return _handle; }
2231 
2233  {
2234  if (_handle == ZMQ_NULLPTR)
2235  // already closed
2236  return;
2237  int rc = zmq_close(_handle);
2238  ZMQ_ASSERT(rc == 0);
2239  _handle = ZMQ_NULLPTR;
2240  ctxptr = ZMQ_NULLPTR;
2241  }
2242 
2244  {
2245  std::swap(_handle, other._handle);
2246  std::swap(ctxptr, other.ctxptr);
2247  }
2248 
2249  operator socket_ref() ZMQ_NOTHROW { return socket_ref(from_handle, _handle); }
2250 
2251  private:
2252  void *ctxptr;
2253 
2255  void operator=(const socket_t &) ZMQ_DELETED_FUNCTION;
2256 
2257  // used by monitor_t
2258  socket_t(void *context_, int type_) :
2259  detail::socket_base(zmq_socket(context_, type_)), ctxptr(context_)
2260  {
2261  if (_handle == ZMQ_NULLPTR)
2262  throw error_t();
2263  if (ctxptr == ZMQ_NULLPTR)
2264  throw error_t();
2265  }
2266 };
2267 
2269 {
2270  a.swap(b);
2271 }
2272 
2273 ZMQ_DEPRECATED("from 4.3.1, use proxy taking socket_t objects")
2274 inline void proxy(void *frontend, void *backend, void *capture)
2275 {
2276  int rc = zmq_proxy(frontend, backend, capture);
2277  if (rc != 0)
2278  throw error_t();
2279 }
2280 
2281 inline void
2283 {
2284  int rc = zmq_proxy(frontend.handle(), backend.handle(), capture.handle());
2285  if (rc != 0)
2286  throw error_t();
2287 }
2288 
2289 #ifdef ZMQ_HAS_PROXY_STEERABLE
2290 ZMQ_DEPRECATED("from 4.3.1, use proxy_steerable taking socket_t objects")
2291 inline void
2292 proxy_steerable(void *frontend, void *backend, void *capture, void *control)
2293 {
2294  int rc = zmq_proxy_steerable(frontend, backend, capture, control);
2295  if (rc != 0)
2296  throw error_t();
2297 }
2298 
2299 inline void proxy_steerable(socket_ref frontend,
2300  socket_ref backend,
2302  socket_ref control)
2303 {
2304  int rc = zmq_proxy_steerable(frontend.handle(), backend.handle(),
2305  capture.handle(), control.handle());
2306  if (rc != 0)
2307  throw error_t();
2308 }
2309 #endif
2310 
2312 {
2313  public:
2315 
2316  virtual ~monitor_t() { close(); }
2317 
2318 #ifdef ZMQ_HAS_RVALUE_REFS
2320  {
2321  std::swap(_socket, rhs._socket);
2322  std::swap(_monitor_socket, rhs._monitor_socket);
2323  }
2324 
2326  {
2327  close();
2328  _socket = socket_ref();
2329  std::swap(_socket, rhs._socket);
2330  std::swap(_monitor_socket, rhs._monitor_socket);
2331  return *this;
2332  }
2333 #endif
2334 
2335 
2336  void
2337  monitor(socket_t &socket, std::string const &addr, int events = ZMQ_EVENT_ALL)
2338  {
2339  monitor(socket, addr.c_str(), events);
2340  }
2341 
2342  void monitor(socket_t &socket, const char *addr_, int events = ZMQ_EVENT_ALL)
2343  {
2344  init(socket, addr_, events);
2345  while (true) {
2346  check_event(-1);
2347  }
2348  }
2349 
2350  void init(socket_t &socket, std::string const &addr, int events = ZMQ_EVENT_ALL)
2351  {
2352  init(socket, addr.c_str(), events);
2353  }
2354 
2355  void init(socket_t &socket, const char *addr_, int events = ZMQ_EVENT_ALL)
2356  {
2357  int rc = zmq_socket_monitor(socket.handle(), addr_, events);
2358  if (rc != 0)
2359  throw error_t();
2360 
2361  _socket = socket;
2363  _monitor_socket.connect(addr_);
2364 
2366  }
2367 
2368  bool check_event(int timeout = 0)
2369  {
2370  assert(_monitor_socket);
2371 
2372  zmq::pollitem_t items[] = {
2373  {_monitor_socket.handle(), 0, ZMQ_POLLIN, 0},
2374  };
2375 
2376  #ifdef ZMQ_CPP11
2377  zmq::poll(&items[0], 1, std::chrono::milliseconds(timeout));
2378  #else
2379  zmq::poll(&items[0], 1, timeout);
2380  #endif
2381 
2382  return process_event(items[0].revents);
2383  }
2384 
2385 #ifdef ZMQ_EVENT_MONITOR_STOPPED
2386  void abort()
2387  {
2388  if (_socket)
2389  zmq_socket_monitor(_socket.handle(), ZMQ_NULLPTR, 0);
2390 
2391  _socket = socket_ref();
2392  }
2393 
2394  virtual void on_monitor_stopped() {}
2395 #endif
2396  virtual void on_monitor_started() {}
2397  virtual void on_event_connected(const zmq_event_t &event_, const char *addr_)
2398  {
2399  (void) event_;
2400  (void) addr_;
2401  }
2402  virtual void on_event_connect_delayed(const zmq_event_t &event_,
2403  const char *addr_)
2404  {
2405  (void) event_;
2406  (void) addr_;
2407  }
2408  virtual void on_event_connect_retried(const zmq_event_t &event_,
2409  const char *addr_)
2410  {
2411  (void) event_;
2412  (void) addr_;
2413  }
2414  virtual void on_event_listening(const zmq_event_t &event_, const char *addr_)
2415  {
2416  (void) event_;
2417  (void) addr_;
2418  }
2419  virtual void on_event_bind_failed(const zmq_event_t &event_, const char *addr_)
2420  {
2421  (void) event_;
2422  (void) addr_;
2423  }
2424  virtual void on_event_accepted(const zmq_event_t &event_, const char *addr_)
2425  {
2426  (void) event_;
2427  (void) addr_;
2428  }
2429  virtual void on_event_accept_failed(const zmq_event_t &event_, const char *addr_)
2430  {
2431  (void) event_;
2432  (void) addr_;
2433  }
2434  virtual void on_event_closed(const zmq_event_t &event_, const char *addr_)
2435  {
2436  (void) event_;
2437  (void) addr_;
2438  }
2439  virtual void on_event_close_failed(const zmq_event_t &event_, const char *addr_)
2440  {
2441  (void) event_;
2442  (void) addr_;
2443  }
2444  virtual void on_event_disconnected(const zmq_event_t &event_, const char *addr_)
2445  {
2446  (void) event_;
2447  (void) addr_;
2448  }
2449 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 3)
2451  const char *addr_)
2452  {
2453  (void) event_;
2454  (void) addr_;
2455  }
2457  const char *addr_)
2458  {
2459  (void) event_;
2460  (void) addr_;
2461  }
2462  virtual void on_event_handshake_failed_auth(const zmq_event_t &event_,
2463  const char *addr_)
2464  {
2465  (void) event_;
2466  (void) addr_;
2467  }
2468  virtual void on_event_handshake_succeeded(const zmq_event_t &event_,
2469  const char *addr_)
2470  {
2471  (void) event_;
2472  (void) addr_;
2473  }
2474 #elif ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 1)
2475  virtual void on_event_handshake_failed(const zmq_event_t &event_,
2476  const char *addr_)
2477  {
2478  (void) event_;
2479  (void) addr_;
2480  }
2481  virtual void on_event_handshake_succeed(const zmq_event_t &event_,
2482  const char *addr_)
2483  {
2484  (void) event_;
2485  (void) addr_;
2486  }
2487 #endif
2488  virtual void on_event_unknown(const zmq_event_t &event_, const char *addr_)
2489  {
2490  (void) event_;
2491  (void) addr_;
2492  }
2493 
2494  protected:
2495  bool process_event(short events)
2496  {
2497  zmq::message_t eventMsg;
2498 
2499  if (events & ZMQ_POLLIN) {
2500  int rc = zmq_msg_recv(eventMsg.handle(), _monitor_socket.handle(), 0);
2501  if (rc == -1 && zmq_errno() == ETERM)
2502  return false;
2503  assert(rc != -1);
2504 
2505  } else {
2506  return false;
2507  }
2508 
2509 #if ZMQ_VERSION_MAJOR >= 4
2510  const char *data = static_cast<const char *>(eventMsg.data());
2511  zmq_event_t msgEvent;
2512  memcpy(&msgEvent.event, data, sizeof(uint16_t));
2513  data += sizeof(uint16_t);
2514  memcpy(&msgEvent.value, data, sizeof(int32_t));
2515  zmq_event_t *event = &msgEvent;
2516 #else
2517  zmq_event_t *event = static_cast<zmq_event_t *>(eventMsg.data());
2518 #endif
2519 
2520 #ifdef ZMQ_NEW_MONITOR_EVENT_LAYOUT
2521  zmq::message_t addrMsg;
2522  int rc = zmq_msg_recv(addrMsg.handle(), _monitor_socket.handle(), 0);
2523  if (rc == -1 && zmq_errno() == ETERM) {
2524  return false;
2525  }
2526 
2527  assert(rc != -1);
2528  std::string address = addrMsg.to_string();
2529 #else
2530  // Bit of a hack, but all events in the zmq_event_t union have the same layout so this will work for all event types.
2531  std::string address = event->data.connected.addr;
2532 #endif
2533 
2534 #ifdef ZMQ_EVENT_MONITOR_STOPPED
2535  if (event->event == ZMQ_EVENT_MONITOR_STOPPED) {
2536  on_monitor_stopped();
2537  return false;
2538  }
2539 
2540 #endif
2541 
2542  switch (event->event) {
2543  case ZMQ_EVENT_CONNECTED:
2544  on_event_connected(*event, address.c_str());
2545  break;
2548  break;
2551  break;
2552  case ZMQ_EVENT_LISTENING:
2553  on_event_listening(*event, address.c_str());
2554  break;
2555  case ZMQ_EVENT_BIND_FAILED:
2556  on_event_bind_failed(*event, address.c_str());
2557  break;
2558  case ZMQ_EVENT_ACCEPTED:
2559  on_event_accepted(*event, address.c_str());
2560  break;
2563  break;
2564  case ZMQ_EVENT_CLOSED:
2565  on_event_closed(*event, address.c_str());
2566  break;
2568  on_event_close_failed(*event, address.c_str());
2569  break;
2571  on_event_disconnected(*event, address.c_str());
2572  break;
2573 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 0) || (defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 3))
2576  break;
2579  break;
2582  break;
2585  break;
2586 #elif defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 1)
2587  case ZMQ_EVENT_HANDSHAKE_FAILED:
2588  on_event_handshake_failed(*event, address.c_str());
2589  break;
2590  case ZMQ_EVENT_HANDSHAKE_SUCCEED:
2591  on_event_handshake_succeed(*event, address.c_str());
2592  break;
2593 #endif
2594  default:
2595  on_event_unknown(*event, address.c_str());
2596  break;
2597  }
2598 
2599  return true;
2600  }
2601 
2603 
2604  private:
2607 
2610 
2612  {
2613  if (_socket)
2614  zmq_socket_monitor(_socket.handle(), ZMQ_NULLPTR, 0);
2616  }
2617 };
2618 
2619 #if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER)
2620 
2621 // polling events
2622 enum class event_flags : short
2623 {
2624  none = 0,
2625  pollin = ZMQ_POLLIN,
2626  pollout = ZMQ_POLLOUT,
2627  pollerr = ZMQ_POLLERR,
2628  pollpri = ZMQ_POLLPRI
2629 };
2630 
2631 constexpr event_flags operator|(event_flags a, event_flags b) noexcept
2632 {
2633  return detail::enum_bit_or(a, b);
2634 }
2635 constexpr event_flags operator&(event_flags a, event_flags b) noexcept
2636 {
2637  return detail::enum_bit_and(a, b);
2638 }
2639 constexpr event_flags operator^(event_flags a, event_flags b) noexcept
2640 {
2641  return detail::enum_bit_xor(a, b);
2642 }
2643 constexpr event_flags operator~(event_flags a) noexcept
2644 {
2645  return detail::enum_bit_not(a);
2646 }
2647 
2648 struct no_user_data;
2649 
2650 // layout compatible with zmq_poller_event_t
2651 template<class T = no_user_data> struct poller_event
2652 {
2653  socket_ref socket;
2654  ::zmq::fd_t fd;
2655  T *user_data;
2656  event_flags events;
2657 };
2658 
2659 template<typename T = no_user_data> class poller_t
2660 {
2661  public:
2662  using event_type = poller_event<T>;
2663 
2664  poller_t() : poller_ptr(zmq_poller_new())
2665  {
2666  if (!poller_ptr)
2667  throw error_t();
2668  }
2669 
2670  template<
2671  typename Dummy = void,
2672  typename =
2674  void add(zmq::socket_ref socket, event_flags events, T *user_data)
2675  {
2676  add_impl(socket, events, user_data);
2677  }
2678 
2679  void add(zmq::socket_ref socket, event_flags events)
2680  {
2681  add_impl(socket, events, nullptr);
2682  }
2683 
2684  template<
2685  typename Dummy = void,
2686  typename =
2688  void add(fd_t fd, event_flags events, T *user_data)
2689  {
2690  add_impl(fd, events, user_data);
2691  }
2692 
2693  void add(fd_t fd, event_flags events) { add_impl(fd, events, nullptr); }
2694 
2695  void remove(zmq::socket_ref socket)
2696  {
2697  if (0 != zmq_poller_remove(poller_ptr.get(), socket.handle())) {
2698  throw error_t();
2699  }
2700  }
2701 
2702  void remove(fd_t fd)
2703  {
2704  if (0 != zmq_poller_remove_fd(poller_ptr.get(), fd)) {
2705  throw error_t();
2706  }
2707  }
2708 
2709  void modify(zmq::socket_ref socket, event_flags events)
2710  {
2711  if (0
2712  != zmq_poller_modify(poller_ptr.get(), socket.handle(),
2713  static_cast<short>(events))) {
2714  throw error_t();
2715  }
2716  }
2717 
2718  void modify(fd_t fd, event_flags events)
2719  {
2720  if (0
2721  != zmq_poller_modify_fd(poller_ptr.get(), fd,
2722  static_cast<short>(events))) {
2723  throw error_t();
2724  }
2725  }
2726 
2727  template <typename Sequence>
2728  size_t wait_all(Sequence &poller_events,
2729  const std::chrono::milliseconds timeout)
2730  {
2732  "Sequence::value_type must be of poller_t::event_type");
2733  int rc = zmq_poller_wait_all(
2734  poller_ptr.get(),
2735  reinterpret_cast<zmq_poller_event_t *>(poller_events.data()),
2736  static_cast<int>(poller_events.size()),
2737  static_cast<long>(timeout.count()));
2738  if (rc > 0)
2739  return static_cast<size_t>(rc);
2740 
2741 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 3)
2742  if (zmq_errno() == EAGAIN)
2743 #else
2744  if (zmq_errno() == ETIMEDOUT)
2745 #endif
2746  return 0;
2747 
2748  throw error_t();
2749  }
2750 
2751 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 3)
2752  size_t size() const noexcept
2753  {
2754  int rc = zmq_poller_size(const_cast<void *>(poller_ptr.get()));
2755  ZMQ_ASSERT(rc >= 0);
2756  return static_cast<size_t>(std::max(rc, 0));
2757  }
2758 #endif
2759 
2760  private:
2761  struct destroy_poller_t
2762  {
2763  void operator()(void *ptr) noexcept
2764  {
2765  int rc = zmq_poller_destroy(&ptr);
2766  ZMQ_ASSERT(rc == 0);
2767  }
2768  };
2769 
2770  std::unique_ptr<void, destroy_poller_t> poller_ptr;
2771 
2772  void add_impl(zmq::socket_ref socket, event_flags events, T *user_data)
2773  {
2774  if (0
2775  != zmq_poller_add(poller_ptr.get(), socket.handle(), user_data,
2776  static_cast<short>(events))) {
2777  throw error_t();
2778  }
2779  }
2780 
2781  void add_impl(fd_t fd, event_flags events, T *user_data)
2782  {
2783  if (0
2784  != zmq_poller_add_fd(poller_ptr.get(), fd, user_data,
2785  static_cast<short>(events))) {
2786  throw error_t();
2787  }
2788  }
2789 };
2790 #endif // defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER)
2791 
2792 inline std::ostream &operator<<(std::ostream &os, const message_t &msg)
2793 {
2794  return os << msg.str();
2795 }
2796 
2797 } // namespace zmq
2798 
2799 #endif // __ZMQ_HPP_INCLUDED__
ZMQ_METADATA
#define ZMQ_METADATA
Definition: zmq_draft.h:27
ZMQ_RECONNECT_STOP
#define ZMQ_RECONNECT_STOP
Definition: zmq_draft.h:41
ZMQ_RCVBUF
#define ZMQ_RCVBUF
Definition: zmq.h:283
zmq_event_t
Definition: zmq.hpp:208
ZMQ_SOCKS_PASSWORD
#define ZMQ_SOCKS_PASSWORD
Definition: zmq_draft.h:32
zmq::monitor_t::on_monitor_started
virtual void on_monitor_started()
Definition: zmq.hpp:2396
ZMQ_MAX_SOCKETS_DFLT
#define ZMQ_MAX_SOCKETS_DFLT
Definition: zmq.h:194
zmq::context_t::ptr
void * ptr
Definition: zmq.hpp:907
zmq_strerror
const ZMQ_EXPORT char * zmq_strerror(int errnum_)
Definition: zmq.cpp:96
zmq_ctx_set
ZMQ_EXPORT int zmq_ctx_set(void *context_, int option_, int optval_)
Definition: zmq.cpp:156
context_
MockGeneratorContext context_
Definition: csharp_bootstrap_unittest.cc:125
zmq_msg_group
const char * zmq_msg_group(zmq_msg_t *msg_)
Definition: zmq.cpp:704
zmq::message_t::handle
const ZMQ_NODISCARD zmq_msg_t * handle() const ZMQ_NOTHROW
Definition: zmq.hpp:737
ZMQ_NODISCARD
#define ZMQ_NODISCARD
Definition: zmq.hpp:77
zmq_ctx_shutdown
ZMQ_EXPORT int zmq_ctx_shutdown(void *context_)
Definition: zmq.cpp:147
data_
StringPiece data_
Definition: bytestream_unittest.cc:60
zmq_version
ZMQ_EXPORT void zmq_version(int *major_, int *minor_, int *patch_)
Definition: zmq.cpp:88
zmq::swap
void swap(message_t &a, message_t &b) ZMQ_NOTHROW
Definition: zmq.hpp:749
zmq::poll
int poll(zmq_pollitem_t *items_, size_t nitems_, long timeout_=-1)
Definition: zmq.hpp:319
zmq::monitor_t::on_event_handshake_failed_auth
virtual void on_event_handshake_failed_auth(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2462
zmq::message_t::move
void move(message_t &msg_)
Definition: zmq.hpp:566
zmq::message_t
Definition: zmq.hpp:409
ZMQ_SERVER
#define ZMQ_SERVER
Definition: zmq_draft.h:14
ZMQ_XPUB_MANUAL
#define ZMQ_XPUB_MANUAL
Definition: zmq.h:332
benchmarks.python.py_benchmark.const
const
Definition: py_benchmark.py:14
zmq::from_handle_t
Definition: zmq.hpp:2101
zmq::message_t::data
const T * data() const ZMQ_NOTHROW
Definition: zmq.hpp:610
zmq::proxy
void proxy(void *frontend, void *backend, void *capture)
Definition: zmq.hpp:2274
ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL
#define ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL
Definition: zmq.h:414
ZMQ_CONSTEXPR_IF
#define ZMQ_CONSTEXPR_IF
Definition: zmq.hpp:105
ZMQ_HEARTBEAT_IVL
#define ZMQ_HEARTBEAT_IVL
Definition: zmq.h:336
end
GLuint GLuint end
Definition: glcorearb.h:2858
ZMQ_EVENT_HANDSHAKE_FAILED_AUTH
#define ZMQ_EVENT_HANDSHAKE_FAILED_AUTH
Definition: zmq.h:423
ZMQ_MAX_SOCKETS
#define ZMQ_MAX_SOCKETS
Definition: zmq.h:182
zmq_msg_set_group
int zmq_msg_set_group(zmq_msg_t *msg_, const char *group_)
Definition: zmq.cpp:699
ZMQ_GATHER
#define ZMQ_GATHER
Definition: zmq_draft.h:18
zmq::monitor_t::monitor
void monitor(socket_t &socket, std::string const &addr, int events=ZMQ_EVENT_ALL)
Definition: zmq.hpp:2337
ZMQ_PLAIN_USERNAME
#define ZMQ_PLAIN_USERNAME
Definition: zmq.h:310
stream
GLuint GLuint stream
Definition: glcorearb.h:3946
zmq::detail::socket_base::connected
bool connected() const ZMQ_NOTHROW
Definition: zmq.hpp:1920
ZMQ_MAX_MSGSZ
#define ZMQ_MAX_MSGSZ
Definition: zmq.h:186
ZMQ_XPUB
#define ZMQ_XPUB
Definition: zmq.h:267
ZMQ_THREAD_AFFINITY_CPU_REMOVE
#define ZMQ_THREAD_AFFINITY_CPU_REMOVE
Definition: zmq.h:189
zmq::socket_t::swap
void swap(socket_t &other) ZMQ_NOTHROW
Definition: zmq.hpp:2243
zmq::context_t::context_t
context_t()
Definition: zmq.hpp:802
zmq::monitor_t::on_event_handshake_failed_no_detail
virtual void on_event_handshake_failed_no_detail(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2450
ZMQ_AFFINITY
#define ZMQ_AFFINITY
Definition: zmq.h:276
ZMQ_PRIORITY
#define ZMQ_PRIORITY
Definition: zmq_draft.h:44
EINTR
#define EINTR
Definition: errno.hpp:7
ZMQ_USE_FD
#define ZMQ_USE_FD
Definition: zmq.h:348
ZMQ_PUB
#define ZMQ_PUB
Definition: zmq.h:259
zmq::monitor_t::on_event_unknown
virtual void on_event_unknown(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2488
ZMQ_EVENTS
#define ZMQ_EVENTS
Definition: zmq.h:286
google::protobuf::operator*
uint128 operator*(const uint128 &lhs, const uint128 &rhs)
Definition: int128.h:308
zmq::from_handle_t::from_handle_t
ZMQ_CONSTEXPR_FN ZMQ_EXPLICIT from_handle_t(_private) ZMQ_NOTHROW
Definition: zmq.hpp:2106
zmq::monitor_t::on_event_bind_failed
virtual void on_event_bind_failed(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2419
zmq::pollitem_t
zmq_pollitem_t pollitem_t
Definition: zmq.hpp:277
zmq::message_t::copy
void copy(message_t const *msg_)
Definition: zmq.hpp:574
zmq::monitor_t::~monitor_t
virtual ~monitor_t()
Definition: zmq.hpp:2316
get
ROSCPP_DECL bool get(const std::string &key, bool &b)
ZMQ_STREAM
#define ZMQ_STREAM
Definition: zmq.h:269
ZMQ_ZAP_ENFORCE_DOMAIN
#define ZMQ_ZAP_ENFORCE_DOMAIN
Definition: zmq_draft.h:25
zmq::message_t::to_string
std::string to_string() const
Definition: zmq.hpp:676
zmq_errno
ZMQ_EXPORT int zmq_errno(void)
Definition: zmq.cpp:101
zmq_msg_move
ZMQ_EXPORT int zmq_msg_move(zmq_msg_t *dest_, zmq_msg_t *src_)
Definition: zmq.cpp:630
ZMQ_GSSAPI_PRINCIPAL_NAMETYPE
#define ZMQ_GSSAPI_PRINCIPAL_NAMETYPE
Definition: zmq.h:349
ZMQ_DELETED_FUNCTION
#define ZMQ_DELETED_FUNCTION
Definition: zmq.hpp:180
zmq_unbind
ZMQ_EXPORT int zmq_unbind(void *s_, const char *addr_)
Definition: zmq.cpp:337
ZMQ_TOS
#define ZMQ_TOS
Definition: zmq.h:322
zmq::context_t::operator=
void operator=(const context_t &) ZMQ_DELETED_FUNCTION
zmq_socket_monitor
ZMQ_EXPORT int zmq_socket_monitor(void *s_, const char *addr_, int events_)
Definition: zmq.cpp:278
zmq_msg_send
ZMQ_EXPORT int zmq_msg_send(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:609
zmq::context_t::setctxopt
int setctxopt(int option_, int optval_)
Definition: zmq.hpp:836
zmq::message_t::handle
ZMQ_NODISCARD zmq_msg_t * handle() ZMQ_NOTHROW
Definition: zmq.hpp:736
zmq_poll
ZMQ_EXPORT int zmq_poll(zmq_pollitem_t *items_, int nitems_, long timeout_)
Definition: zmq.cpp:827
benchmarks.util.result_uploader.metadata
def metadata
Definition: result_uploader.py:97
EAGAIN
#define EAGAIN
Definition: errno.hpp:14
ZMQ_CLIENT
#define ZMQ_CLIENT
Definition: zmq_draft.h:15
ZMQ_EVENT_CLOSED
#define ZMQ_EVENT_CLOSED
Definition: zmq.h:408
zmq::socket_t
Definition: zmq.hpp:2188
ZMQ_PLAIN_SERVER
#define ZMQ_PLAIN_SERVER
Definition: zmq.h:309
zmq_ctx_new
ZMQ_EXPORT void * zmq_ctx_new(void)
Definition: zmq.cpp:109
ZMQ_CURVE_SECRETKEY
#define ZMQ_CURVE_SECRETKEY
Definition: zmq.h:314
zmq::context_t::swap
void swap(context_t &other) ZMQ_NOTHROW
Definition: zmq.hpp:904
ZMQ_SOCKET_LIMIT
#define ZMQ_SOCKET_LIMIT
Definition: zmq.h:183
ZMQ_RECOVERY_IVL
#define ZMQ_RECOVERY_IVL
Definition: zmq.h:281
google::protobuf::operator+=
Duration & operator+=(Duration &d1, const Duration &d2)
Definition: time_util.cc:408
zmq::error_t::errnum
int errnum
Definition: zmq.hpp:302
zmq::message_t::data
void * data() ZMQ_NOTHROW
Definition: zmq.hpp:594
ZMQ_EVENT_BIND_FAILED
#define ZMQ_EVENT_BIND_FAILED
Definition: zmq.h:405
zmq_msg_get
ZMQ_EXPORT int zmq_msg_get(const zmq_msg_t *msg_, int property_)
Definition: zmq.cpp:657
zmq::socket_t::socket_t
socket_t(void *context_, int type_)
Definition: zmq.hpp:2258
ZMQ_TYPE
#define ZMQ_TYPE
Definition: zmq.h:287
ZMQ_RADIO
#define ZMQ_RADIO
Definition: zmq_draft.h:16
zmq::monitor_t::on_event_disconnected
virtual void on_event_disconnected(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2444
zmq::operator>
bool operator>(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
Definition: zmq.hpp:2158
ZMQ_VMCI_BUFFER_MIN_SIZE
#define ZMQ_VMCI_BUFFER_MIN_SIZE
Definition: zmq.h:345
ImGui::Dummy
IMGUI_API void Dummy(const ImVec2 &size)
Definition: imgui_widgets.cpp:1215
zmq::monitor_t::monitor_t
monitor_t()
Definition: zmq.hpp:2314
ZMQ_PLAIN_PASSWORD
#define ZMQ_PLAIN_PASSWORD
Definition: zmq.h:311
ZMQ_LAST_ENDPOINT
#define ZMQ_LAST_ENDPOINT
Definition: zmq.h:298
ZMQ_CURVE_SERVERKEY
#define ZMQ_CURVE_SERVERKEY
Definition: zmq.h:315
ZMQ_POLLPRI
#define ZMQ_POLLPRI
Definition: zmq.h:485
zmq::message_t::data
const void * data() const ZMQ_NOTHROW
Definition: zmq.hpp:596
zmq::from_handle
ZMQ_CONSTEXPR_VAR from_handle_t from_handle
Definition: zmq.hpp:2109
zmq::detail::socket_base::ZMQ_CPP11_DEPRECATED
ZMQ_CPP11_DEPRECATED("from 4.4.1, use send taking message_t or buffer (for contiguous " "ranges), and send_flags") bool send(T first
ZMQ_STREAM_NOTIFY
#define ZMQ_STREAM_NOTIFY
Definition: zmq.h:334
zmq_poller_remove_fd
int zmq_poller_remove_fd(void *poller_, zmq::fd_t fd_)
Definition: zmq.cpp:1568
zmq::monitor_t::on_event_accept_failed
virtual void on_event_accept_failed(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2429
ZMQ_XPUB_MANUAL_LAST_VALUE
#define ZMQ_XPUB_MANUAL_LAST_VALUE
Definition: zmq_draft.h:30
zmq::detail::socket_base::bind
void bind(const char *addr_)
Definition: zmq.hpp:1885
zmq::detail::socket_base::setsockopt
void setsockopt(int option_, T const &optval)
Definition: zmq.hpp:1742
zmq::monitor_t::monitor
void monitor(socket_t &socket, const char *addr_, int events=ZMQ_EVENT_ALL)
Definition: zmq.hpp:2342
ZMQ_CONNECT_TIMEOUT
#define ZMQ_CONNECT_TIMEOUT
Definition: zmq.h:340
zmq::message_t::more
bool more() const ZMQ_NOTHROW
Definition: zmq.hpp:588
ZMQ_EVENT_CLOSE_FAILED
#define ZMQ_EVENT_CLOSE_FAILED
Definition: zmq.h:409
zmq::monitor_t::on_event_listening
virtual void on_event_listening(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2414
string
GLsizei const GLchar *const * string
Definition: glcorearb.h:3083
ZMQ_CONSTEXPR_VAR
#define ZMQ_CONSTEXPR_VAR
Definition: zmq.hpp:94
zmq::message_t::swap
void swap(message_t &other) ZMQ_NOTHROW
Definition: zmq.hpp:730
errno
int errno
ZMQ_MULTICAST_LOOP
#define ZMQ_MULTICAST_LOOP
Definition: zmq_draft.h:28
ZMQ_SUBSCRIBE
#define ZMQ_SUBSCRIBE
Definition: zmq.h:278
ZMQ_ASSERT
#define ZMQ_ASSERT(expression)
Definition: zmq.hpp:224
zmq::detail::socket_base::unbind
void unbind(std::string const &addr)
Definition: zmq.hpp:1892
ZMQ_XSUB
#define ZMQ_XSUB
Definition: zmq.h:268
zmq::operator<
bool operator<(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
Definition: zmq.hpp:2154
zmq::monitor_t::check_event
bool check_event(int timeout=0)
Definition: zmq.hpp:2368
zmq::operator>=
bool operator>=(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
Definition: zmq.hpp:2166
zmq_pollitem_t
Definition: zmq.h:487
zmq::error_t::error_t
error_t() ZMQ_NOTHROW
Definition: zmq.hpp:293
client
void client(int num)
Definition: test_multithread.cpp:134
address
const char * address
Definition: builds/zos/test_fork.cpp:6
ZMQ_SUB
#define ZMQ_SUB
Definition: zmq.h:260
zmq::message_t::message_t
message_t(size_t size_)
Definition: zmq.hpp:418
ZMQ_HEARTBEAT_TIMEOUT
#define ZMQ_HEARTBEAT_TIMEOUT
Definition: zmq.h:338
zmq::detail::socket_base::send
size_t send(const void *buf_, size_t len_, int flags_=0)
Definition: zmq.hpp:1923
T
#define T(upbtypeconst, upbtype, ctype, default_value)
rep
void * rep[services]
Definition: test_req_relaxed.cpp:11
zmq::message_t::equal
bool equal(const message_t *other) const ZMQ_NOTHROW
Definition: zmq.hpp:616
zmq::detail::socket_base::socket_base
ZMQ_EXPLICIT socket_base(void *handle) ZMQ_NOTHROW
Definition: zmq.hpp:1738
zmq::socket_t::operator=
void operator=(const socket_t &) ZMQ_DELETED_FUNCTION
zmq::operator==
bool operator==(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
Definition: zmq.hpp:2146
zmq::context_t::close
void close() ZMQ_NOTHROW
Definition: zmq.hpp:867
zmq::socket_ref
Definition: zmq.hpp:2114
ZMQ_REQ
#define ZMQ_REQ
Definition: zmq.h:261
testing::gmock_generated_actions_test::Char
char Char(char ch)
Definition: gmock-generated-actions_test.cc:63
zmq_msg_data
ZMQ_EXPORT void * zmq_msg_data(zmq_msg_t *msg_)
Definition: zmq.cpp:642
zmq::detail::socket_base::disconnect
void disconnect(const char *addr_)
Definition: zmq.hpp:1912
flags
GLbitfield flags
Definition: glcorearb.h:3585
zmq::operator<<
std::ostream & operator<<(std::ostream &os, const message_t &msg)
Definition: zmq.hpp:2792
zmq_connect
ZMQ_EXPORT int zmq_connect(void *s_, const char *addr_)
Definition: zmq.cpp:307
ZMQ_THREAD_SCHED_POLICY
#define ZMQ_THREAD_SCHED_POLICY
Definition: zmq.h:185
ZMQ_VMCI_BUFFER_MAX_SIZE
#define ZMQ_VMCI_BUFFER_MAX_SIZE
Definition: zmq.h:346
zmq::fd_t
int fd_t
Definition: zmq.hpp:287
ZMQ_REQ_RELAXED
#define ZMQ_REQ_RELAXED
Definition: zmq.h:318
zmq_poller_modify_fd
int zmq_poller_modify_fd(void *poller_, zmq::fd_t fd_, short events_)
Definition: zmq.cpp:1548
ZMQ_EVENT_LISTENING
#define ZMQ_EVENT_LISTENING
Definition: zmq.h:404
ZMQ_IMMEDIATE
#define ZMQ_IMMEDIATE
Definition: zmq.h:304
b
GLboolean GLboolean GLboolean b
Definition: glcorearb.h:3228
zmq::message_t::message_t
message_t(ForwardIter first, ForwardIter last)
Definition: zmq.hpp:425
ZMQ_POLLIN
#define ZMQ_POLLIN
Definition: zmq.h:482
ZMQ_TCP_KEEPALIVE_INTVL
#define ZMQ_TCP_KEEPALIVE_INTVL
Definition: zmq.h:303
ZMQ_DEPRECATED
#define ZMQ_DEPRECATED(msg)
Definition: zmq.hpp:71
ZMQ_ZERO_COPY_RECV
#define ZMQ_ZERO_COPY_RECV
Definition: zmq_draft.h:71
zmq_msg_init_data
ZMQ_EXPORT int zmq_msg_init_data(zmq_msg_t *msg_, void *data_, size_t size_, zmq_free_fn *ffn_, void *hint_)
Definition: zmq.cpp:602
zmq_msg_size
ZMQ_EXPORT size_t zmq_msg_size(const zmq_msg_t *msg_)
Definition: zmq.cpp:647
zmq::monitor_t::init
void init(socket_t &socket, std::string const &addr, int events=ZMQ_EVENT_ALL)
Definition: zmq.hpp:2350
ZMQ_RECONNECT_IVL_MAX
#define ZMQ_RECONNECT_IVL_MAX
Definition: zmq.h:291
begin
static size_t begin(const upb_table *t)
Definition: php/ext/google/protobuf/upb.c:4898
zmq
Definition: zmq.hpp:229
zmq.h
zmq::context_t
Definition: zmq.hpp:799
ZMQ_CONNECT_ROUTING_ID
#define ZMQ_CONNECT_ROUTING_ID
Definition: zmq.h:323
ZMQ_POLLOUT
#define ZMQ_POLLOUT
Definition: zmq.h:483
ZMQ_EVENT_HANDSHAKE_SUCCEEDED
#define ZMQ_EVENT_HANDSHAKE_SUCCEEDED
Definition: zmq.h:417
ZMQ_OVERRIDE
#define ZMQ_OVERRIDE
Definition: zmq.hpp:91
zmq_msg_gets
const ZMQ_EXPORT char * zmq_msg_gets(const zmq_msg_t *msg_, const char *property_)
Definition: zmq.cpp:711
zmq::detail::socket_base::set_option
void set_option(int option_, const void *optval_, size_t optvallen_)
Definition: zmq.hpp:2085
ZMQ_VMCI_CONNECT_TIMEOUT
#define ZMQ_VMCI_CONNECT_TIMEOUT
Definition: zmq.h:347
ZMQ_RCVHWM
#define ZMQ_RCVHWM
Definition: zmq.h:294
zmq::message_t::get
int get(int property_)
Definition: zmq.hpp:630
ZMQ_DEALER
#define ZMQ_DEALER
Definition: zmq.h:263
zmq_event_t::event
uint16_t event
Definition: zmq.hpp:210
zmq_poller_modify
int zmq_poller_modify(void *poller_, void *s_, short events_)
Definition: zmq.cpp:1535
ZMQ_ROUTER_HANDOVER
#define ZMQ_ROUTER_HANDOVER
Definition: zmq.h:321
zmq::context_t::handle
ZMQ_NODISCARD void * handle() ZMQ_NOTHROW
Definition: zmq.hpp:899
ZMQ_XPUB_WELCOME_MSG
#define ZMQ_XPUB_WELCOME_MSG
Definition: zmq.h:333
ZMQ_CHANNEL
#define ZMQ_CHANNEL
Definition: zmq_draft.h:22
zmq::detail::socket_base::last
T last
Definition: zmq.hpp:1949
zmq_setsockopt
ZMQ_EXPORT int zmq_setsockopt(void *s_, int option_, const void *optval_, size_t optvallen_)
Definition: zmq.cpp:250
ZMQ_SNDTIMEO
#define ZMQ_SNDTIMEO
Definition: zmq.h:297
ZMQ_EVENT_CONNECTED
#define ZMQ_EVENT_CONNECTED
Definition: zmq.h:401
zmq::monitor_t::on_event_handshake_failed_protocol
virtual void on_event_handshake_failed_protocol(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2456
zmq_disconnect
ZMQ_EXPORT int zmq_disconnect(void *s_, const char *addr_)
Definition: zmq.cpp:345
zmq::message_t::rebuild
void rebuild(const std::string &str)
Definition: zmq.hpp:543
event
struct _cl_event * event
Definition: glcorearb.h:4163
buffer
GLuint buffer
Definition: glcorearb.h:2939
ZMQ_PUSH
#define ZMQ_PUSH
Definition: zmq.h:266
ZMQ_ROUTER
#define ZMQ_ROUTER
Definition: zmq.h:264
zmq_poller_event_t
Definition: zmq_draft.h:114
zmq_poller_new
void * zmq_poller_new(void)
Definition: zmq.cpp:1429
zmq::version
void version(int *major_, int *minor_, int *patch_)
Definition: zmq.hpp:381
zmq::error_t::num
int num() const ZMQ_NOTHROW
Definition: zmq.hpp:299
update_failure_list.str
str
Definition: update_failure_list.py:41
ZMQ_TCP_KEEPALIVE_IDLE
#define ZMQ_TCP_KEEPALIVE_IDLE
Definition: zmq.h:302
ZMQ_DISCONNECT_MSG
#define ZMQ_DISCONNECT_MSG
Definition: zmq_draft.h:43
ETERM
#define ETERM
Definition: zmq.h:161
zmq_msg_t
Definition: zmq.h:218
ZMQ_REP
#define ZMQ_REP
Definition: zmq.h:262
google::protobuf.internal::false_type
integral_constant< bool, false > false_type
Definition: template_util.h:90
zmq::message_t::operator!=
bool operator!=(const message_t &other) const ZMQ_NOTHROW
Definition: zmq.hpp:624
p
const char * p
Definition: gmock-matchers_test.cc:3863
zmq::monitor_t::_socket
socket_ref _socket
Definition: zmq.hpp:2608
zmq::monitor_t::process_event
bool process_event(short events)
Definition: zmq.hpp:2495
std::swap
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
Definition: json.h:1226
zmq::socket_ref::socket_ref
socket_ref(from_handle_t, void *handle) ZMQ_NOTHROW
Definition: zmq.hpp:2121
ZMQ_HELLO_MSG
#define ZMQ_HELLO_MSG
Definition: zmq_draft.h:42
err
static UPB_NORETURN void err(tarjan *t)
Definition: ruby/ext/google/protobuf_c/upb.c:5856
zmq_bind
ZMQ_EXPORT int zmq_bind(void *s_, const char *addr_)
Definition: zmq.cpp:299
ZMQ_POLLERR
#define ZMQ_POLLERR
Definition: zmq.h:484
ZMQ_ROUTER_RAW
#define ZMQ_ROUTER_RAW
Definition: zmq.h:306
zmq::detail::poll
int poll(zmq_pollitem_t *items_, size_t nitems_, long timeout_)
Definition: zmq.hpp:306
size
#define size
Definition: glcorearb.h:2944
zmq::message_t::gets
const char * gets(const char *property_)
Definition: zmq.hpp:640
zmq_msg_recv
ZMQ_EXPORT int zmq_msg_recv(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:617
google::protobuf.internal::true_type
integral_constant< bool, true > true_type
Definition: template_util.h:89
timeout
GLbitfield GLuint64 timeout
Definition: glcorearb.h:3588
zmq::socket_t::close
void close() ZMQ_NOTHROW
Definition: zmq.hpp:2232
zmq_socket
ZMQ_EXPORT void * zmq_socket(void *, int type_)
Definition: zmq.cpp:230
ZMQ_RATE
#define ZMQ_RATE
Definition: zmq.h:280
ZMQ_INVERT_MATCHING
#define ZMQ_INVERT_MATCHING
Definition: zmq.h:335
ZMQ_GSSAPI_SERVICE_PRINCIPAL
#define ZMQ_GSSAPI_SERVICE_PRINCIPAL
Definition: zmq.h:326
ZMQ_MULTICAST_MAXTPDU
#define ZMQ_MULTICAST_MAXTPDU
Definition: zmq.h:343
byte
SETUP_TEARDOWN_TESTCONTEXT typedef uint8_t byte
Definition: test_stream.cpp:12
zmq::monitor_t::on_event_close_failed
virtual void on_event_close_failed(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2439
ZMQ_THREAD_PRIORITY
#define ZMQ_THREAD_PRIORITY
Definition: zmq.h:184
ZMQ_DONTWAIT
#define ZMQ_DONTWAIT
Definition: zmq.h:358
ZMQ_BINDTODEVICE
#define ZMQ_BINDTODEVICE
Definition: zmq.h:351
server
void * server
Definition: test_security_curve.cpp:29
zmq::context_t::shutdown
void shutdown() ZMQ_NOTHROW
Definition: zmq.hpp:884
zmq_leave
int zmq_leave(void *s_, const char *group_)
Definition: zmq.cpp:291
ZMQ_MECHANISM
#define ZMQ_MECHANISM
Definition: zmq.h:308
ZMQ_VMCI_BUFFER_SIZE
#define ZMQ_VMCI_BUFFER_SIZE
Definition: zmq.h:344
zmq::monitor_t::on_event_closed
virtual void on_event_closed(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2434
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glcorearb.h:4175
ZMQ_CPP11_DEPRECATED
#define ZMQ_CPP11_DEPRECATED(msg)
Definition: zmq.hpp:95
zmq::proxy_steerable
void proxy_steerable(void *frontend, void *backend, void *capture, void *control)
Definition: zmq.hpp:2292
ZMQ_EVENT_ACCEPT_FAILED
#define ZMQ_EVENT_ACCEPT_FAILED
Definition: zmq.h:407
ZMQ_BUSY_POLL
#define ZMQ_BUSY_POLL
Definition: zmq_draft.h:45
zmq::message_t::rebuild
void rebuild()
Definition: zmq.hpp:513
zmq::socket_t::socket_t
socket_t() ZMQ_NOTHROW
Definition: zmq.hpp:2193
ZMQ_SOCKS_PROXY
#define ZMQ_SOCKS_PROXY
Definition: zmq.h:329
ZMQ_NOTHROW
#define ZMQ_NOTHROW
Definition: zmq.hpp:89
ZMQ_GSSAPI_PRINCIPAL
#define ZMQ_GSSAPI_PRINCIPAL
Definition: zmq.h:325
ZMQ_PEER
#define ZMQ_PEER
Definition: zmq_draft.h:21
zmq::monitor_t
Definition: zmq.hpp:2311
zmq::monitor_t::on_event_handshake_succeeded
virtual void on_event_handshake_succeeded(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2468
zmq::detail::socket_base::socket_base
socket_base() ZMQ_NOTHROW
Definition: zmq.hpp:1737
ZMQ_TCP_KEEPALIVE
#define ZMQ_TCP_KEEPALIVE
Definition: zmq.h:300
zmq::message_t::message_t
message_t() ZMQ_NOTHROW
Definition: zmq.hpp:412
zmq_msg_init
ZMQ_EXPORT int zmq_msg_init(zmq_msg_t *msg_)
Definition: zmq.cpp:587
void
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
n
GLdouble n
Definition: glcorearb.h:4153
zmq::from_handle_t::_private
Definition: zmq.hpp:2103
zmq_close
ZMQ_EXPORT int zmq_close(void *s_)
Definition: zmq.cpp:241
zmq_free_fn
void() zmq_free_fn(void *data_, void *hint_)
Definition: zmq.h:234
ZMQ_HEARTBEAT_TTL
#define ZMQ_HEARTBEAT_TTL
Definition: zmq.h:337
zmq::message_t::rebuild
void rebuild(const void *data_, size_t size_)
Definition: zmq.hpp:532
ZMQ_ZAP_DOMAIN
#define ZMQ_ZAP_DOMAIN
Definition: zmq.h:320
zmq_msg_set_routing_id
int zmq_msg_set_routing_id(zmq_msg_t *msg_, uint32_t routing_id_)
Definition: zmq.cpp:688
zmq::message_t::message_t
message_t(const void *data_, size_t size_)
Definition: zmq.hpp:438
ZMQ_ROUTER_MANDATORY
#define ZMQ_ROUTER_MANDATORY
Definition: zmq.h:299
ZMQ_CONSTEXPR_FN
#define ZMQ_CONSTEXPR_FN
Definition: zmq.hpp:93
zmq_join
int zmq_join(void *s_, const char *group_)
Definition: zmq.cpp:283
ZMQ_HANDSHAKE_IVL
#define ZMQ_HANDSHAKE_IVL
Definition: zmq.h:328
zmq::free_fn
zmq_free_fn free_fn
Definition: zmq.hpp:276
ZMQ_THREAD_AFFINITY_CPU_ADD
#define ZMQ_THREAD_AFFINITY_CPU_ADD
Definition: zmq.h:188
ZMQ_EXPLICIT
#define ZMQ_EXPLICIT
Definition: zmq.hpp:90
zmq::monitor_t::on_event_connect_retried
virtual void on_event_connect_retried(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2408
ZMQ_XPUB_VERBOSE
#define ZMQ_XPUB_VERBOSE
Definition: zmq.h:305
socket_type
int socket_type
type
GLenum type
Definition: glcorearb.h:2695
google::protobuf::operator~
uint128 operator~(const uint128 &val)
Definition: int128.h:201
zmq::monitor_t::monitor_socket
socket_ref monitor_socket()
Definition: zmq.hpp:2602
ZMQ_SNDHWM
#define ZMQ_SNDHWM
Definition: zmq.h:293
ZMQ_LINGER
#define ZMQ_LINGER
Definition: zmq.h:288
zmq::monitor_t::init
void init(socket_t &socket, const char *addr_, int events=ZMQ_EVENT_ALL)
Definition: zmq.hpp:2355
zmq::detail::socket_base::getsockopt
void getsockopt(int option_, void *optval_, size_t *optvallen_) const
Definition: zmq.hpp:1756
ZMQ_ONLY_FIRST_SUBSCRIBE
#define ZMQ_ONLY_FIRST_SUBSCRIBE
Definition: zmq_draft.h:40
ZMQ_EVENT_CONNECT_DELAYED
#define ZMQ_EVENT_CONNECT_DELAYED
Definition: zmq.h:402
ZMQ_XPUB_VERBOSER
#define ZMQ_XPUB_VERBOSER
Definition: zmq.h:339
zmq::detail::socket_base::connect
void connect(const char *addr_)
Definition: zmq.hpp:1903
zmq_ctx_get
ZMQ_EXPORT int zmq_ctx_get(void *context_, int option_)
Definition: zmq.cpp:174
req
void * req
Definition: test_req_relaxed.cpp:10
len
int len
Definition: php/ext/google/protobuf/map.c:206
ZMQ_DGRAM
#define ZMQ_DGRAM
Definition: zmq_draft.h:20
ZMQ_GSSAPI_SERVER
#define ZMQ_GSSAPI_SERVER
Definition: zmq.h:324
ZMQ_PAIR
#define ZMQ_PAIR
Definition: zmq.h:258
ZMQ_SCATTER
#define ZMQ_SCATTER
Definition: zmq_draft.h:19
zmq_poller_size
int zmq_poller_size(void *poller_)
Definition: zmq.cpp:1501
ZMQ_RCVTIMEO
#define ZMQ_RCVTIMEO
Definition: zmq.h:296
v
const GLdouble * v
Definition: glcorearb.h:3106
ZMQ_BACKLOG
#define ZMQ_BACKLOG
Definition: zmq.h:290
zmq::socket_t::socket_t
socket_t(context_t &context_, int type_)
Definition: zmq.hpp:2195
zmq_recv
ZMQ_EXPORT int zmq_recv(void *s_, void *buf_, size_t len_, int flags_)
Definition: zmq.cpp:487
ZMQ_EVENT_ACCEPTED
#define ZMQ_EVENT_ACCEPTED
Definition: zmq.h:406
zmq_proxy_steerable
ZMQ_EXPORT int zmq_proxy_steerable(void *frontend_, void *backend_, void *capture_, void *control_)
Definition: zmq.cpp:1738
ZMQ_EVENT_CONNECT_RETRIED
#define ZMQ_EVENT_CONNECT_RETRIED
Definition: zmq.h:403
ZMQ_CURVE_SERVER
#define ZMQ_CURVE_SERVER
Definition: zmq.h:312
zmq_poller_add
int zmq_poller_add(void *poller_, void *s_, void *user_data_, short events_)
Definition: zmq.cpp:1509
ZMQ_DISH
#define ZMQ_DISH
Definition: zmq_draft.h:17
ZMQ_EVENT_ALL
#define ZMQ_EVENT_ALL
Definition: zmq.h:412
zmq_proxy
ZMQ_EXPORT int zmq_proxy(void *frontend_, void *backend_, void *capture_)
Definition: zmq.cpp:1726
value_type
zend_class_entry * value_type
Definition: php/ext/google/protobuf/message.c:2546
ZMQ_SNDBUF
#define ZMQ_SNDBUF
Definition: zmq.h:282
zmq::detail::socket_base::flags_
T int flags_
Definition: zmq.hpp:1949
ZMQ_EVENT_DISCONNECTED
#define ZMQ_EVENT_DISCONNECTED
Definition: zmq.h:410
zmq::detail::socket_base
Definition: zmq.hpp:1734
size
GLsizeiptr size
Definition: glcorearb.h:2943
ZMQ_UNSUBSCRIBE
#define ZMQ_UNSUBSCRIBE
Definition: zmq.h:279
zmq::operator!=
bool operator!=(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
Definition: zmq.hpp:2150
std
zmq::detail::socket_base::get_option
void get_option(int option_, void *optval_, size_t *optvallen_) const
Definition: zmq.hpp:2092
ZMQ_PROBE_ROUTER
#define ZMQ_PROBE_ROUTER
Definition: zmq.h:316
zmq::monitor_t::on_event_connected
virtual void on_event_connected(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2397
ZMQ_IPV6
#define ZMQ_IPV6
Definition: zmq.h:307
zmq_msg_init_size
ZMQ_EXPORT int zmq_msg_init_size(zmq_msg_t *msg_, size_t size_)
Definition: zmq.cpp:592
zmq::detail::socket_base::disconnect
void disconnect(std::string const &addr)
Definition: zmq.hpp:1910
cpp.gmock_class.set
set
Definition: gmock_class.py:44
zmq_msg_copy
ZMQ_EXPORT int zmq_msg_copy(zmq_msg_t *dest_, zmq_msg_t *src_)
Definition: zmq.cpp:636
zmq::detail::socket_base::connect
void connect(std::string const &addr)
Definition: zmq.hpp:1901
r
GLboolean r
Definition: glcorearb.h:3228
zmq::message_t::data
T * data() ZMQ_NOTHROW
Definition: zmq.hpp:608
ZMQ_IO_THREADS
#define ZMQ_IO_THREADS
Definition: zmq.h:181
ZMQ_SNDMORE
#define ZMQ_SNDMORE
Definition: zmq.h:359
fd_t
zmq_fd_t fd_t
Definition: libzmq/tests/testutil.hpp:98
ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE
#define ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE
Definition: zmq.h:350
push
static void push(tarjan *t, const upb_refcounted *r)
Definition: ruby/ext/google/protobuf_c/upb.c:5890
ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL
#define ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL
Definition: zmq.h:420
zmq::detail::socket_base::bind
void bind(std::string const &addr)
Definition: zmq.hpp:1883
first
GLint first
Definition: glcorearb.h:2830
capture
static int capture(class zmq::socket_base_t *capture_, zmq::msg_t *msg_, int more_=0)
Definition: proxy.cpp:58
ZMQ_REQ_CORRELATE
#define ZMQ_REQ_CORRELATE
Definition: zmq.h:317
ZMQ_THREAD_NAME_PREFIX
#define ZMQ_THREAD_NAME_PREFIX
Definition: zmq.h:190
ZMQ_ROUTING_ID
#define ZMQ_ROUTING_ID
Definition: zmq.h:277
zmq::message_t::copy
void copy(message_t &msg_)
Definition: zmq.hpp:581
zmq_msg_routing_id
uint32_t zmq_msg_routing_id(zmq_msg_t *msg_)
Definition: zmq.cpp:694
zmq::message_t::rebuild
void rebuild(size_t size_)
Definition: zmq.hpp:522
zmq::message_t::str
std::string str() const
Definition: zmq.hpp:694
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: glcorearb.h:2879
Range
Range(1<< 0, 1<< 10)
ZMQ_ROUTER_NOTIFY
#define ZMQ_ROUTER_NOTIFY
Definition: zmq_draft.h:29
zmq::socket_t::~socket_t
~socket_t() ZMQ_NOTHROW
Definition: zmq.hpp:2226
zmq::message_t::empty
ZMQ_NODISCARD bool empty() const ZMQ_NOTHROW
Definition: zmq.hpp:606
ETIMEDOUT
#define ETIMEDOUT
Definition: zmq.h:149
zmq_poller_remove
int zmq_poller_remove(void *poller_, void *s_)
Definition: zmq.cpp:1558
zmq::message_t::operator==
bool operator==(const message_t &other) const ZMQ_NOTHROW
Definition: zmq.hpp:618
zmq::error_t::error_t
error_t(int err) ZMQ_NOTHROW
Definition: zmq.hpp:294
val
GLuint GLfloat * val
Definition: glcorearb.h:3604
zmq::message_t::operator=
void operator=(const message_t &) ZMQ_DELETED_FUNCTION
ZMQ_FD
#define ZMQ_FD
Definition: zmq.h:285
zmq::socket_ref::socket_ref
socket_ref() ZMQ_NOTHROW
Definition: zmq.hpp:2117
ZMQ_RECONNECT_IVL
#define ZMQ_RECONNECT_IVL
Definition: zmq.h:289
ZMQ_NULLPTR
#define ZMQ_NULLPTR
Definition: zmq.hpp:92
zmq::monitor_t::close
void close() ZMQ_NOTHROW
Definition: zmq.hpp:2611
zmq::monitor_t::on_event_accepted
virtual void on_event_accepted(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2424
ZMQ_GSSAPI_PLAINTEXT
#define ZMQ_GSSAPI_PLAINTEXT
Definition: zmq.h:327
zmq_ctx_term
ZMQ_EXPORT int zmq_ctx_term(void *context_)
Definition: zmq.cpp:128
zmq::context_t::~context_t
~context_t() ZMQ_NOTHROW
Definition: zmq.hpp:833
zmq::socket_t::ctxptr
void * ctxptr
Definition: zmq.hpp:2252
zmq_poller_add_fd
int zmq_poller_add_fd(void *poller_, zmq::fd_t fd_, void *user_data_, short events_)
Definition: zmq.cpp:1521
zmq::context_t::context_t
context_t(int io_threads_, int max_sockets_=ZMQ_MAX_SOCKETS_DFLT)
Definition: zmq.hpp:810
value
GLsizei const GLfloat * value
Definition: glcorearb.h:3093
zmq::monitor_t::on_event_connect_delayed
virtual void on_event_connect_delayed(const zmq_event_t &event_, const char *addr_)
Definition: zmq.hpp:2402
zmq_send
ZMQ_EXPORT int zmq_send(void *s_, const void *buf_, size_t len_, int flags_)
Definition: zmq.cpp:377
ZMQ_MAXMSGSIZE
#define ZMQ_MAXMSGSIZE
Definition: zmq.h:292
zmq::detail::socket_base::unbind
void unbind(const char *addr_)
Definition: zmq.hpp:1894
zmq::message_t::msg
zmq_msg_t msg
Definition: zmq.hpp:741
ZMQ_MSG_T_SIZE
#define ZMQ_MSG_T_SIZE
Definition: zmq.h:187
ZMQ_PULL
#define ZMQ_PULL
Definition: zmq.h:265
ZMQ_TCP_MAXRT
#define ZMQ_TCP_MAXRT
Definition: zmq.h:341
zmq_event_t::value
int32_t value
Definition: zmq.hpp:211
zmq_msg_more
ZMQ_EXPORT int zmq_msg_more(const zmq_msg_t *msg_)
Definition: zmq.cpp:652
ZMQ_TCP_KEEPALIVE_CNT
#define ZMQ_TCP_KEEPALIVE_CNT
Definition: zmq.h:301
zmq::message_t::move
void move(message_t const *msg_)
Definition: zmq.hpp:559
zmq::message_t::size
size_t size() const ZMQ_NOTHROW
Definition: zmq.hpp:601
zmq::error_t::what
virtual const char * what() const ZMQ_NOTHROW ZMQ_OVERRIDE
Definition: zmq.hpp:295
ZMQ_RCVMORE
#define ZMQ_RCVMORE
Definition: zmq.h:284
group
static uint32_t * group(tarjan *t, upb_refcounted *r)
Definition: ruby/ext/google/protobuf_c/upb.c:5943
a
GLboolean GLboolean GLboolean GLboolean a
Definition: glcorearb.h:3228
zmq_msg_close
ZMQ_EXPORT int zmq_msg_close(zmq_msg_t *msg_)
Definition: zmq.cpp:625
zmq::context_t::getctxopt
int getctxopt(int option_)
Definition: zmq.hpp:844
ZMQ_CONFLATE
#define ZMQ_CONFLATE
Definition: zmq.h:319
zmq::message_t::~message_t
~message_t() ZMQ_NOTHROW
Definition: zmq.hpp:507
ZMQ_MULTICAST_HOPS
#define ZMQ_MULTICAST_HOPS
Definition: zmq.h:295
zmq::message_t::rebuild
void rebuild(void *data_, size_t size_, free_fn *ffn_, void *hint_=ZMQ_NULLPTR)
Definition: zmq.hpp:548
zmq::error_t
Definition: zmq.hpp:290
zmq_poller_destroy
int zmq_poller_destroy(void **poller_p_)
Definition: zmq.cpp:1438
zmq_getsockopt
ZMQ_EXPORT int zmq_getsockopt(void *s_, int option_, void *optval_, size_t *optvallen_)
Definition: zmq.cpp:261
ZMQ_BLOCKY
#define ZMQ_BLOCKY
Definition: zmq.h:331
ZMQ_THREAD_SAFE
#define ZMQ_THREAD_SAFE
Definition: zmq.h:342
ZMQ_CURVE_PUBLICKEY
#define ZMQ_CURVE_PUBLICKEY
Definition: zmq.h:313
zmq_poller_wait_all
int zmq_poller_wait_all(void *poller_, zmq_poller_event_t *events_, int n_events_, long timeout_)
Definition: zmq.cpp:1590
google::protobuf::operator+
uint128 operator+(const uint128 &lhs, const uint128 &rhs)
Definition: int128.h:300
ZMQ_EVENT_MONITOR_STOPPED
#define ZMQ_EVENT_MONITOR_STOPPED
Definition: zmq.h:411
zmq::message_t::message_t
message_t(void *data_, size_t size_, free_fn *ffn_, void *hint_=ZMQ_NULLPTR)
Definition: zmq.hpp:450
ZMQ_SOCKS_USERNAME
#define ZMQ_SOCKS_USERNAME
Definition: zmq_draft.h:31
zmq::monitor_t::operator=
void operator=(const monitor_t &) ZMQ_DELETED_FUNCTION
zmq::operator<=
bool operator<=(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
Definition: zmq.hpp:2162
ZMQ_XPUB_NODROP
#define ZMQ_XPUB_NODROP
Definition: zmq.h:330
zmq::monitor_t::_monitor_socket
socket_t _monitor_socket
Definition: zmq.hpp:2609


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:07:02