26 #ifndef __ZMQ_HPP_INCLUDED__ 27 #define __ZMQ_HPP_INCLUDED__ 38 #if defined(_MSVC_LANG) 39 #define CPPZMQ_LANG _MSVC_LANG 41 #define CPPZMQ_LANG __cplusplus 44 #if defined(_HAS_CXX14) && _HAS_CXX14 && CPPZMQ_LANG < 201402L 46 #define CPPZMQ_LANG 201402L 48 #if defined(_HAS_CXX17) && _HAS_CXX17 && CPPZMQ_LANG < 201703L 50 #define CPPZMQ_LANG 201703L 54 #if CPPZMQ_LANG >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900) 57 #if CPPZMQ_LANG >= 201402L 60 #if CPPZMQ_LANG >= 201703L 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))) 72 #if defined(ZMQ_CPP17) 73 #define ZMQ_NODISCARD [[nodiscard]] 78 #if defined(ZMQ_CPP11) 79 #define ZMQ_NOTHROW noexcept 80 #define ZMQ_EXPLICIT explicit 81 #define ZMQ_OVERRIDE override 82 #define ZMQ_NULLPTR nullptr 83 #define ZMQ_CONSTEXPR_FN constexpr 84 #define ZMQ_CONSTEXPR_VAR constexpr 85 #define ZMQ_CPP11_DEPRECATED(msg) ZMQ_DEPRECATED(msg) 87 #define ZMQ_NOTHROW throw() 91 #define ZMQ_CONSTEXPR_FN 92 #define ZMQ_CONSTEXPR_VAR const 93 #define ZMQ_CPP11_DEPRECATED(msg) 95 #if defined(ZMQ_CPP14) && (!defined(_MSC_VER) || _MSC_VER > 1900) 96 #define ZMQ_EXTENDED_CONSTEXPR 98 #if defined(ZMQ_CPP17) 99 #define ZMQ_INLINE_VAR inline 100 #define ZMQ_CONSTEXPR_IF constexpr 102 #define ZMQ_INLINE_VAR 103 #define ZMQ_CONSTEXPR_IF 122 #if defined(__has_include) && defined(ZMQ_CPP17) 123 #define CPPZMQ_HAS_INCLUDE_CPP17(X) __has_include(X) 125 #define CPPZMQ_HAS_INCLUDE_CPP17(X) 0 128 #if CPPZMQ_HAS_INCLUDE_CPP17(<optional>) && !defined(CPPZMQ_HAS_OPTIONAL) 129 #define CPPZMQ_HAS_OPTIONAL 1 131 #ifndef CPPZMQ_HAS_OPTIONAL 132 #define CPPZMQ_HAS_OPTIONAL 0 133 #elif CPPZMQ_HAS_OPTIONAL 137 #if CPPZMQ_HAS_INCLUDE_CPP17(<string_view>) && !defined(CPPZMQ_HAS_STRING_VIEW) 138 #define CPPZMQ_HAS_STRING_VIEW 1 140 #ifndef CPPZMQ_HAS_STRING_VIEW 141 #define CPPZMQ_HAS_STRING_VIEW 0 142 #elif CPPZMQ_HAS_STRING_VIEW 143 #include <string_view> 147 #define CPPZMQ_VERSION_MAJOR 4 148 #define CPPZMQ_VERSION_MINOR 8 149 #define CPPZMQ_VERSION_PATCH 0 151 #define CPPZMQ_VERSION \ 152 ZMQ_MAKE_VERSION(CPPZMQ_VERSION_MAJOR, CPPZMQ_VERSION_MINOR, \ 153 CPPZMQ_VERSION_PATCH) 156 #if (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) \ 157 && defined(__GXX_EXPERIMENTAL_CXX0X__)) 158 #define ZMQ_HAS_RVALUE_REFS 159 #define ZMQ_DELETED_FUNCTION = delete 160 #elif defined(__clang__) 161 #if __has_feature(cxx_rvalue_references) 162 #define ZMQ_HAS_RVALUE_REFS 165 #if __has_feature(cxx_deleted_functions) 166 #define ZMQ_DELETED_FUNCTION = delete 168 #define ZMQ_DELETED_FUNCTION 170 #elif defined(_MSC_VER) && (_MSC_VER >= 1900) 171 #define ZMQ_HAS_RVALUE_REFS 172 #define ZMQ_DELETED_FUNCTION = delete 173 #elif defined(_MSC_VER) && (_MSC_VER >= 1600) 174 #define ZMQ_HAS_RVALUE_REFS 175 #define ZMQ_DELETED_FUNCTION 177 #define ZMQ_DELETED_FUNCTION 180 #if defined(ZMQ_CPP11) && !defined(__llvm__) && !defined(__INTEL_COMPILER) \ 181 && defined(__GNUC__) && __GNUC__ < 5 182 #define ZMQ_CPP11_PARTIAL 183 #elif defined(__GLIBCXX__) && __GLIBCXX__ < 20160805 186 #define ZMQ_CPP11_PARTIAL 190 #ifdef ZMQ_CPP11_PARTIAL 191 #define ZMQ_IS_TRIVIALLY_COPYABLE(T) __has_trivial_copy(T) 193 #include <type_traits> 194 #define ZMQ_IS_TRIVIALLY_COPYABLE(T) std::is_trivially_copyable<T>::value 198 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3, 3, 0) 199 #define ZMQ_NEW_MONITOR_EVENT_LAYOUT 202 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 1, 0) 203 #define ZMQ_HAS_PROXY_STEERABLE 213 #if ZMQ_VERSION < ZMQ_MAKE_VERSION(3, 2, 0) 214 #define zmq_msg_recv(msg, socket, flags) zmq_recvmsg(socket, msg, flags) 221 #define ZMQ_ASSERT(expression) assert(expression) 223 #define ZMQ_ASSERT(expression) (void) (expression) 235 template<
class T>
auto begin(T &&r) -> decltype(begin(std::forward<T>(r)))
237 return begin(std::forward<T>(r));
239 template<
class T>
auto end(T &&r) -> decltype(end(std::forward<T>(r)))
241 return end(std::forward<T>(r));
245 template<
class T>
using void_t = void;
248 using iter_value_t =
typename std::iterator_traits<Iter>::value_type;
250 template<
class Range>
251 using range_iter_t = decltype(
252 ranges::begin(std::declval<
typename std::remove_reference<Range>::type &>()));
254 template<
class Range>
using range_value_t = iter_value_t<range_iter_t<Range>>;
256 template<
class T,
class =
void>
struct is_range : std::false_type
264 ranges::begin(std::declval<typename std::remove_reference<T>::type &>())
265 == ranges::end(std::declval<typename std::remove_reference<T>::type &>()))>>
279 typedef unsigned __int64
fd_t;
281 typedef unsigned int fd_t;
294 return zmq_strerror(errnum);
302 inline int poll(zmq_pollitem_t *items_,
size_t nitems_,
long timeout_ = -1)
304 int rc = zmq_poll(items_, static_cast<int>(nitems_), timeout_);
310 ZMQ_DEPRECATED(
"from 4.3.1, use poll taking non-const items")
311 inline
int poll(zmq_pollitem_t const *items_,
size_t nitems_,
long timeout_ = -1)
313 return poll(const_cast<zmq_pollitem_t *>(items_), nitems_, timeout_);
317 ZMQ_DEPRECATED(
"from 4.3.1, use poll taking non-const items")
319 poll(zmq_pollitem_t
const *items,
size_t nitems, std::chrono::milliseconds timeout)
321 return poll(const_cast<zmq_pollitem_t *>(items), nitems,
322 static_cast<long>(timeout.count()));
325 ZMQ_DEPRECATED(
"from 4.3.1, use poll taking non-const items")
326 inline int poll(std::vector<zmq_pollitem_t>
const &items,
327 std::chrono::milliseconds timeout)
329 return poll(const_cast<zmq_pollitem_t *>(items.data()), items.size(),
330 static_cast<long>(timeout.count()));
333 ZMQ_DEPRECATED(
"from 4.3.1, use poll taking non-const items")
334 inline int poll(std::vector<zmq_pollitem_t>
const &items,
long timeout_ = -1)
336 return poll(const_cast<zmq_pollitem_t *>(items.data()), items.size(), timeout_);
340 poll(zmq_pollitem_t *items,
size_t nitems, std::chrono::milliseconds timeout)
342 return poll(items, nitems, static_cast<long>(timeout.count()));
345 inline int poll(std::vector<zmq_pollitem_t> &items,
346 std::chrono::milliseconds timeout)
348 return poll(items.data(), items.size(),
static_cast<long>(timeout.count()));
351 ZMQ_DEPRECATED(
"from 4.3.1, use poll taking std::chrono instead of long")
352 inline int poll(std::vector<zmq_pollitem_t> &items,
long timeout_ = -1)
354 return poll(items.data(), items.size(), timeout_);
357 template<std::
size_t SIZE>
358 inline int poll(std::array<zmq_pollitem_t, SIZE> &items,
359 std::chrono::milliseconds timeout)
361 return poll(items.data(), items.size(),
static_cast<long>(timeout.count()));
366 inline void version(
int *major_,
int *minor_,
int *patch_)
368 zmq_version(major_, minor_, patch_);
372 inline std::tuple<int, int, int>
version()
374 std::tuple<int, int, int> v;
375 zmq_version(&std::get<0>(v), &std::get<1>(v), &std::get<2>(v));
379 #if !defined(ZMQ_CPP11_PARTIAL) 382 template<
class T>
struct is_char_type
385 static constexpr
bool value =
386 std::is_same<T, char>::value || std::is_same<T, wchar_t>::value
387 || std::is_same<T, char16_t>::value || std::is_same<T, char32_t>::value;
399 int rc = zmq_msg_init(&msg);
405 int rc = zmq_msg_init_size(&msg, size_);
410 template<
class ForwardIter>
message_t(ForwardIter first, ForwardIter last)
412 typedef typename std::iterator_traits<ForwardIter>::value_type value_t;
414 assert(std::distance(first, last) >= 0);
416 static_cast<size_t>(std::distance(first, last)) *
sizeof(value_t);
417 int const rc = zmq_msg_init_size(&msg, size_);
420 std::copy(first, last, data<value_t>());
425 int rc = zmq_msg_init_size(&msg, size_);
431 memcpy(
data(), data_, size_);
437 int rc = zmq_msg_init_data(&msg, data_, size_, ffn_, hint_);
443 #if defined(ZMQ_CPP11) && !defined(ZMQ_CPP11_PARTIAL) 451 typename =
typename std::enable_if<detail::is_char_type<Char>::value>::type>
452 ZMQ_DEPRECATED(
"from 4.7.0, use constructors taking iterators, (pointer, size) " 453 "or strings instead")
455 message_t(detail::ranges::begin(
data), detail::ranges::end(
data))
459 template<
class Range,
461 detail::is_range<Range>::value
462 && ZMQ_IS_TRIVIALLY_COPYABLE(detail::range_value_t<Range>)
463 && !detail::is_char_type<detail::range_value_t<Range>>::value
464 && !std::is_same<Range, message_t>::value>::type>
465 explicit message_t(
const Range &rng) :
466 message_t(detail::ranges::begin(rng), detail::ranges::end(rng))
470 explicit message_t(
const std::string &str) : message_t(str.data(), str.size()) {}
472 #if CPPZMQ_HAS_STRING_VIEW 473 explicit message_t(std::string_view str) : message_t(str.data(), str.size()) {}
478 #ifdef ZMQ_HAS_RVALUE_REFS 479 message_t(message_t &&rhs)
ZMQ_NOTHROW : msg(rhs.msg)
481 int rc = zmq_msg_init(&rhs.msg);
494 int rc = zmq_msg_close(&msg);
500 int rc = zmq_msg_close(&msg);
503 rc = zmq_msg_init(&msg);
509 int rc = zmq_msg_close(&msg);
512 rc = zmq_msg_init_size(&msg, size_);
519 int rc = zmq_msg_close(&msg);
522 rc = zmq_msg_init_size(&msg, size_);
525 memcpy(
data(), data_, size_);
530 int rc = zmq_msg_close(&msg);
533 rc = zmq_msg_init_data(&msg, data_, size_, ffn_, hint_);
538 ZMQ_DEPRECATED(
"from 4.3.1, use move taking non-const reference instead")
539 void move(message_t const *msg_)
541 int rc = zmq_msg_move(&msg, const_cast<zmq_msg_t *>(msg_->handle()));
548 int rc = zmq_msg_move(&msg, msg_.
handle());
553 ZMQ_DEPRECATED(
"from 4.3.1, use copy taking non-const reference instead")
556 int rc = zmq_msg_copy(&msg, const_cast<zmq_msg_t *>(msg_->handle()));
563 int rc = zmq_msg_copy(&msg, msg_.
handle());
570 int rc = zmq_msg_more(const_cast<zmq_msg_t *>(&msg));
578 return zmq_msg_data(const_cast<zmq_msg_t *>(&msg));
583 return zmq_msg_size(const_cast<zmq_msg_t *>(&msg));
592 return static_cast<T
const *
>(
data());
595 ZMQ_DEPRECATED(
"from 4.3.0, use operator== instead")
600 const size_t my_size = size();
601 return my_size == other.size() && 0 == memcmp(
data(), other.data(), my_size);
606 return !(*
this == other);
609 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3, 2, 0) 610 int get(
int property_)
612 int value = zmq_msg_get(&msg, property_);
619 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 1, 0) 620 const char *
gets(
const char *property_)
622 const char *value = zmq_msg_gets(&msg, property_);
629 #if defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 0) 630 uint32_t routing_id()
const 632 return zmq_msg_routing_id(const_cast<zmq_msg_t *>(&msg));
635 void set_routing_id(uint32_t routing_id)
637 int rc = zmq_msg_set_routing_id(&msg, routing_id);
642 const char *group()
const 644 return zmq_msg_group(const_cast<zmq_msg_t *>(&msg));
647 void set_group(
const char *group)
649 int rc = zmq_msg_set_group(&msg, group);
658 return std::string(static_cast<const char *>(
data()), size());
660 #if CPPZMQ_HAS_STRING_VIEW 664 return std::string_view(static_cast<const char *>(
data()), size());
677 std::stringstream os;
679 const unsigned char *msg_data = this->data<unsigned char>();
681 size_t size = this->size();
682 int is_ascii[2] = {0, 0};
684 os <<
"zmq::message_t [size " << std::dec << std::setw(3)
685 << std::setfill(
'0') << size <<
"] (";
688 os <<
"... too big to print)";
693 is_ascii[1] = (byte >= 32 && byte < 127);
694 if (is_ascii[1] != is_ascii[0])
700 os << std::hex << std::uppercase << std::setw(2)
701 << std::setfill(
'0') <<
static_cast<short>(byte);
703 is_ascii[0] = is_ascii[1];
740 #ifdef ZMQ_IO_THREADS 741 io_threads = ZMQ_IO_THREADS,
743 #ifdef ZMQ_THREAD_SCHED_POLICY 744 thread_sched_policy = ZMQ_THREAD_SCHED_POLICY,
746 #ifdef ZMQ_THREAD_PRIORITY 747 thread_priority = ZMQ_THREAD_PRIORITY,
749 #ifdef ZMQ_THREAD_AFFINITY_CPU_ADD 750 thread_affinity_cpu_add = ZMQ_THREAD_AFFINITY_CPU_ADD,
752 #ifdef ZMQ_THREAD_AFFINITY_CPU_REMOVE 753 thread_affinity_cpu_remove = ZMQ_THREAD_AFFINITY_CPU_REMOVE,
755 #ifdef ZMQ_THREAD_NAME_PREFIX 756 thread_name_prefix = ZMQ_THREAD_NAME_PREFIX,
759 max_msgsz = ZMQ_MAX_MSGSZ,
761 #ifdef ZMQ_ZERO_COPY_RECV 762 zero_copy_recv = ZMQ_ZERO_COPY_RECV,
764 #ifdef ZMQ_MAX_SOCKETS 765 max_sockets = ZMQ_MAX_SOCKETS,
767 #ifdef ZMQ_SOCKET_LIMIT 768 socket_limit = ZMQ_SOCKET_LIMIT,
773 #ifdef ZMQ_MSG_T_SIZE 774 msg_t_size = ZMQ_MSG_T_SIZE
790 explicit context_t(
int io_threads_,
int max_sockets_ = ZMQ_MAX_SOCKETS_DFLT)
796 int rc = zmq_ctx_set(ptr, ZMQ_IO_THREADS, io_threads_);
799 rc = zmq_ctx_set(ptr, ZMQ_MAX_SOCKETS, max_sockets_);
803 #ifdef ZMQ_HAS_RVALUE_REFS 816 int setctxopt(
int option_,
int optval_)
818 int rc = zmq_ctx_set(ptr, option_, optval_);
824 int getctxopt(
int option_) {
return zmq_ctx_get(ptr, option_); }
827 void set(ctxopt option,
int optval)
829 int rc = zmq_ctx_set(ptr, static_cast<int>(option), optval);
836 int rc = zmq_ctx_get(ptr, static_cast<int>(option));
854 rc = zmq_ctx_destroy(ptr);
855 }
while (rc == -1 && errno == EINTR);
868 int rc = zmq_ctx_shutdown(ptr);
881 ZMQ_DEPRECATED(
"from 4.7.0, use handle() != nullptr instead")
900 struct recv_buffer_size
903 size_t untruncated_size;
907 return size != untruncated_size;
911 #if CPPZMQ_HAS_OPTIONAL 913 using send_result_t = std::optional<size_t>;
914 using recv_result_t = std::optional<size_t>;
915 using recv_buffer_result_t = std::optional<recv_buffer_size>;
923 template<
class T>
class trivial_optional
926 static_assert(std::is_trivial<T>::value,
"T must be trivial");
927 using value_type = T;
929 trivial_optional() =
default;
930 trivial_optional(T value) noexcept : _value(value), _has_value(
true) {}
932 const T *operator->()
const noexcept
937 T *operator->() noexcept
943 const T &operator*()
const noexcept
948 T &operator*() noexcept
957 throw std::exception();
960 const T &value()
const 963 throw std::exception();
967 explicit operator bool()
const noexcept {
return _has_value; }
968 bool has_value()
const noexcept {
return _has_value; }
972 bool _has_value{
false};
976 using send_result_t = detail::trivial_optional<size_t>;
977 using recv_result_t = detail::trivial_optional<size_t>;
978 using recv_buffer_result_t = detail::trivial_optional<recv_buffer_size>;
984 template<
class T> constexpr T enum_bit_or(T a, T b) noexcept
986 static_assert(std::is_enum<T>::value,
"must be enum");
987 using U =
typename std::underlying_type<T>::type;
988 return static_cast<T
>(
static_cast<U
>(a) | static_cast<U>(b));
990 template<
class T> constexpr T enum_bit_and(T a, T b) noexcept
992 static_assert(std::is_enum<T>::value,
"must be enum");
993 using U =
typename std::underlying_type<T>::type;
994 return static_cast<T
>(
static_cast<U
>(a) & static_cast<U>(b));
996 template<
class T> constexpr T enum_bit_xor(T a, T b) noexcept
998 static_assert(std::is_enum<T>::value,
"must be enum");
999 using U =
typename std::underlying_type<T>::type;
1000 return static_cast<T
>(
static_cast<U
>(a) ^ static_cast<U>(b));
1002 template<
class T> constexpr T enum_bit_not(T a) noexcept
1004 static_assert(std::is_enum<T>::value,
"must be enum");
1005 using U =
typename std::underlying_type<T>::type;
1006 return static_cast<T
>(~static_cast<U>(a));
1011 enum class send_flags : int
1014 dontwait = ZMQ_DONTWAIT,
1015 sndmore = ZMQ_SNDMORE
1018 constexpr send_flags operator|(send_flags a, send_flags b) noexcept
1020 return detail::enum_bit_or(a, b);
1022 constexpr send_flags operator&(send_flags a, send_flags b) noexcept
1024 return detail::enum_bit_and(a, b);
1026 constexpr send_flags operator^(send_flags a, send_flags b) noexcept
1028 return detail::enum_bit_xor(a, b);
1030 constexpr send_flags operator~(send_flags a) noexcept
1032 return detail::enum_bit_not(a);
1036 enum class recv_flags : int
1039 dontwait = ZMQ_DONTWAIT
1042 constexpr recv_flags operator|(recv_flags a, recv_flags b) noexcept
1044 return detail::enum_bit_or(a, b);
1046 constexpr recv_flags operator&(recv_flags a, recv_flags b) noexcept
1048 return detail::enum_bit_and(a, b);
1050 constexpr recv_flags operator^(recv_flags a, recv_flags b) noexcept
1052 return detail::enum_bit_xor(a, b);
1054 constexpr recv_flags operator~(recv_flags a) noexcept
1056 return detail::enum_bit_not(a);
1064 class mutable_buffer
1067 constexpr mutable_buffer() noexcept : _data(
nullptr), _size(0) {}
1068 constexpr mutable_buffer(
void *p,
size_t n) noexcept : _data(p), _size(n)
1070 #ifdef ZMQ_EXTENDED_CONSTEXPR 1071 assert(p !=
nullptr || n == 0);
1075 constexpr
void *
data()
const noexcept {
return _data; }
1076 constexpr
size_t size()
const noexcept {
return _size; }
1077 mutable_buffer &operator+=(
size_t n) noexcept
1080 const auto shift = (std::min)(n, _size);
1081 _data =
static_cast<char *
>(_data) + shift;
1091 inline mutable_buffer operator+(
const mutable_buffer &mb,
size_t n) noexcept
1093 return mutable_buffer(static_cast<char *>(mb.data()) + (std::min)(n, mb.size()),
1094 mb.size() - (std::min)(n, mb.size()));
1096 inline mutable_buffer operator+(
size_t n,
const mutable_buffer &mb) noexcept
1104 constexpr const_buffer() noexcept : _data(
nullptr), _size(0) {}
1105 constexpr const_buffer(
const void *p,
size_t n) noexcept : _data(p), _size(n)
1107 #ifdef ZMQ_EXTENDED_CONSTEXPR 1108 assert(p !=
nullptr || n == 0);
1111 constexpr const_buffer(
const mutable_buffer &mb) noexcept :
1112 _data(mb.data()), _size(mb.size())
1116 constexpr
const void *
data()
const noexcept {
return _data; }
1117 constexpr
size_t size()
const noexcept {
return _size; }
1118 const_buffer &operator+=(
size_t n) noexcept
1120 const auto shift = (std::min)(n, _size);
1121 _data =
static_cast<const char *
>(_data) + shift;
1131 inline const_buffer operator+(
const const_buffer &cb,
size_t n) noexcept
1133 return const_buffer(static_cast<const char *>(cb.data())
1134 + (std::min)(n, cb.size()),
1135 cb.size() - (std::min)(n, cb.size()));
1137 inline const_buffer operator+(
size_t n,
const const_buffer &cb) noexcept
1144 constexpr mutable_buffer
buffer(
void *p,
size_t n) noexcept
1146 return mutable_buffer(p, n);
1148 constexpr const_buffer
buffer(
const void *p,
size_t n) noexcept
1150 return const_buffer(p, n);
1152 constexpr mutable_buffer
buffer(
const mutable_buffer &mb) noexcept
1156 inline mutable_buffer
buffer(
const mutable_buffer &mb,
size_t n) noexcept
1158 return mutable_buffer(mb.data(), (std::min)(mb.size(), n));
1160 constexpr const_buffer
buffer(
const const_buffer &cb) noexcept
1164 inline const_buffer
buffer(
const const_buffer &cb,
size_t n) noexcept
1166 return const_buffer(cb.data(), (std::min)(cb.size(), n));
1171 template<
class T>
struct is_buffer
1173 static constexpr
bool value =
1174 std::is_same<T, const_buffer>::value || std::is_same<T, mutable_buffer>::value;
1177 template<
class T>
struct is_pod_like
1183 static constexpr
bool value =
1184 ZMQ_IS_TRIVIALLY_COPYABLE(T) && std::is_standard_layout<T>::value;
1187 template<
class C> constexpr
auto seq_size(
const C &c) noexcept -> decltype(c.size())
1191 template<
class T,
size_t N>
1192 constexpr
size_t seq_size(
const T (&)[N]) noexcept
1198 auto buffer_contiguous_sequence(Seq &&seq) noexcept
1199 -> decltype(
buffer(std::addressof(*std::begin(seq)),
size_t{}))
1201 using T =
typename std::remove_cv<
1202 typename std::remove_reference<decltype(*std::begin(seq))>::type>::type;
1203 static_assert(detail::is_pod_like<T>::value,
"T must be POD");
1205 const auto size = seq_size(seq);
1206 return buffer(size != 0u ? std::addressof(*std::begin(seq)) :
nullptr,
1210 auto buffer_contiguous_sequence(Seq &&seq,
size_t n_bytes) noexcept
1211 -> decltype(buffer_contiguous_sequence(seq))
1213 using T =
typename std::remove_cv<
1214 typename std::remove_reference<decltype(*std::begin(seq))>::type>::type;
1215 static_assert(detail::is_pod_like<T>::value,
"T must be POD");
1217 const auto size = seq_size(seq);
1218 return buffer(size != 0u ? std::addressof(*std::begin(seq)) :
nullptr,
1219 (std::min)(size *
sizeof(T), n_bytes));
1225 template<
class T,
size_t N> mutable_buffer
buffer(T (&
data)[N]) noexcept
1227 return detail::buffer_contiguous_sequence(
data);
1229 template<
class T,
size_t N>
1230 mutable_buffer
buffer(T (&
data)[N],
size_t n_bytes) noexcept
1232 return detail::buffer_contiguous_sequence(
data, n_bytes);
1234 template<
class T,
size_t N> const_buffer
buffer(
const T (&
data)[N]) noexcept
1236 return detail::buffer_contiguous_sequence(
data);
1238 template<
class T,
size_t N>
1239 const_buffer
buffer(
const T (&
data)[N],
size_t n_bytes) noexcept
1241 return detail::buffer_contiguous_sequence(
data, n_bytes);
1244 template<
class T,
size_t N> mutable_buffer
buffer(std::array<T, N> &
data) noexcept
1246 return detail::buffer_contiguous_sequence(
data);
1248 template<
class T,
size_t N>
1249 mutable_buffer
buffer(std::array<T, N> &
data,
size_t n_bytes) noexcept
1251 return detail::buffer_contiguous_sequence(
data, n_bytes);
1253 template<
class T,
size_t N>
1254 const_buffer
buffer(std::array<const T, N> &
data) noexcept
1256 return detail::buffer_contiguous_sequence(
data);
1258 template<
class T,
size_t N>
1259 const_buffer
buffer(std::array<const T, N> &
data,
size_t n_bytes) noexcept
1261 return detail::buffer_contiguous_sequence(
data, n_bytes);
1263 template<
class T,
size_t N>
1264 const_buffer
buffer(
const std::array<T, N> &
data) noexcept
1266 return detail::buffer_contiguous_sequence(
data);
1268 template<
class T,
size_t N>
1269 const_buffer
buffer(
const std::array<T, N> &
data,
size_t n_bytes) noexcept
1271 return detail::buffer_contiguous_sequence(
data, n_bytes);
1274 template<
class T,
class Allocator>
1275 mutable_buffer
buffer(std::vector<T, Allocator> &
data) noexcept
1277 return detail::buffer_contiguous_sequence(
data);
1279 template<
class T,
class Allocator>
1280 mutable_buffer
buffer(std::vector<T, Allocator> &
data,
size_t n_bytes) noexcept
1282 return detail::buffer_contiguous_sequence(
data, n_bytes);
1284 template<
class T,
class Allocator>
1285 const_buffer
buffer(
const std::vector<T, Allocator> &
data) noexcept
1287 return detail::buffer_contiguous_sequence(
data);
1289 template<
class T,
class Allocator>
1290 const_buffer
buffer(
const std::vector<T, Allocator> &
data,
size_t n_bytes) noexcept
1292 return detail::buffer_contiguous_sequence(
data, n_bytes);
1295 template<
class T,
class Traits,
class Allocator>
1296 mutable_buffer
buffer(std::basic_string<T, Traits, Allocator> &
data) noexcept
1298 return detail::buffer_contiguous_sequence(
data);
1300 template<
class T,
class Traits,
class Allocator>
1301 mutable_buffer
buffer(std::basic_string<T, Traits, Allocator> &
data,
1302 size_t n_bytes) noexcept
1304 return detail::buffer_contiguous_sequence(
data, n_bytes);
1306 template<
class T,
class Traits,
class Allocator>
1307 const_buffer
buffer(
const std::basic_string<T, Traits, Allocator> &
data) noexcept
1309 return detail::buffer_contiguous_sequence(
data);
1311 template<
class T,
class Traits,
class Allocator>
1312 const_buffer
buffer(
const std::basic_string<T, Traits, Allocator> &
data,
1313 size_t n_bytes) noexcept
1315 return detail::buffer_contiguous_sequence(
data, n_bytes);
1318 #if CPPZMQ_HAS_STRING_VIEW 1320 template<
class T,
class Traits>
1321 const_buffer
buffer(std::basic_string_view<T, Traits>
data) noexcept
1323 return detail::buffer_contiguous_sequence(
data);
1325 template<
class T,
class Traits>
1326 const_buffer
buffer(std::basic_string_view<T, Traits>
data,
size_t n_bytes) noexcept
1328 return detail::buffer_contiguous_sequence(
data, n_bytes);
1335 template<
class Char,
size_t N>
1336 constexpr const_buffer str_buffer(
const Char (&
data)[N]) noexcept
1338 static_assert(detail::is_pod_like<Char>::value,
"Char must be POD");
1339 #ifdef ZMQ_EXTENDED_CONSTEXPR 1340 assert(
data[N - 1] == Char{0});
1342 return const_buffer(static_cast<const Char *>(
data), (N - 1) *
sizeof(Char));
1347 constexpr const_buffer
operator"" _zbuf(
const char *str,
size_t len) noexcept
1349 return const_buffer(str, len *
sizeof(
char));
1351 constexpr const_buffer
operator"" _zbuf(
const wchar_t *str,
size_t len) noexcept
1353 return const_buffer(str, len *
sizeof(
wchar_t));
1355 constexpr const_buffer
operator"" _zbuf(
const char16_t *str,
size_t len) noexcept
1357 return const_buffer(str, len *
sizeof(char16_t));
1359 constexpr const_buffer
operator"" _zbuf(
const char32_t *str,
size_t len) noexcept
1361 return const_buffer(str, len *
sizeof(char32_t));
1372 template<
int Opt,
class T,
bool BoolUnit = false>
struct integral_option
1380 template<
int Opt,
int NullTerm = 1>
struct array_option
1384 #define ZMQ_DEFINE_INTEGRAL_OPT(OPT, NAME, TYPE) \ 1385 using NAME##_t = integral_option<OPT, TYPE, false>; \ 1386 ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {} 1387 #define ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(OPT, NAME, TYPE) \ 1388 using NAME##_t = integral_option<OPT, TYPE, true>; \ 1389 ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {} 1390 #define ZMQ_DEFINE_ARRAY_OPT(OPT, NAME) \ 1391 using NAME##_t = array_option<OPT>; \ 1392 ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {} 1393 #define ZMQ_DEFINE_ARRAY_OPT_BINARY(OPT, NAME) \ 1394 using NAME##_t = array_option<OPT, 0>; \ 1395 ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {} 1396 #define ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(OPT, NAME) \ 1397 using NAME##_t = array_option<OPT, 2>; \ 1398 ZMQ_INLINE_VAR ZMQ_CONSTEXPR_VAR NAME##_t NAME {} 1404 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_AFFINITY, affinity, uint64_t);
1407 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_BACKLOG, backlog,
int);
1409 #ifdef ZMQ_BINDTODEVICE 1410 ZMQ_DEFINE_ARRAY_OPT_BINARY(ZMQ_BINDTODEVICE, bindtodevice);
1413 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_CONFLATE, conflate,
int);
1415 #ifdef ZMQ_CONNECT_ROUTING_ID 1416 ZMQ_DEFINE_ARRAY_OPT(ZMQ_CONNECT_ROUTING_ID, connect_routing_id);
1418 #ifdef ZMQ_CONNECT_TIMEOUT 1419 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_CONNECT_TIMEOUT, connect_timeout,
int);
1421 #ifdef ZMQ_CURVE_PUBLICKEY 1422 ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(ZMQ_CURVE_PUBLICKEY, curve_publickey);
1424 #ifdef ZMQ_CURVE_SECRETKEY 1425 ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(ZMQ_CURVE_SECRETKEY, curve_secretkey);
1427 #ifdef ZMQ_CURVE_SERVER 1428 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_CURVE_SERVER, curve_server,
int);
1430 #ifdef ZMQ_CURVE_SERVERKEY 1431 ZMQ_DEFINE_ARRAY_OPT_BIN_OR_Z85(ZMQ_CURVE_SERVERKEY, curve_serverkey);
1434 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_EVENTS, events,
int);
1437 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_FD, fd, ::
zmq::fd_t);
1439 #ifdef ZMQ_GSSAPI_PLAINTEXT 1440 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_GSSAPI_PLAINTEXT, gssapi_plaintext,
int);
1442 #ifdef ZMQ_GSSAPI_SERVER 1443 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_GSSAPI_SERVER, gssapi_server,
int);
1445 #ifdef ZMQ_GSSAPI_SERVICE_PRINCIPAL 1446 ZMQ_DEFINE_ARRAY_OPT(ZMQ_GSSAPI_SERVICE_PRINCIPAL, gssapi_service_principal);
1448 #ifdef ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE 1449 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_GSSAPI_SERVICE_PRINCIPAL_NAMETYPE,
1450 gssapi_service_principal_nametype,
1453 #ifdef ZMQ_GSSAPI_PRINCIPAL 1454 ZMQ_DEFINE_ARRAY_OPT(ZMQ_GSSAPI_PRINCIPAL, gssapi_principal);
1456 #ifdef ZMQ_GSSAPI_PRINCIPAL_NAMETYPE 1457 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_GSSAPI_PRINCIPAL_NAMETYPE,
1458 gssapi_principal_nametype,
1461 #ifdef ZMQ_HANDSHAKE_IVL 1462 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HANDSHAKE_IVL, handshake_ivl,
int);
1464 #ifdef ZMQ_HEARTBEAT_IVL 1465 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HEARTBEAT_IVL, heartbeat_ivl,
int);
1467 #ifdef ZMQ_HEARTBEAT_TIMEOUT 1468 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HEARTBEAT_TIMEOUT, heartbeat_timeout,
int);
1470 #ifdef ZMQ_HEARTBEAT_TTL 1471 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_HEARTBEAT_TTL, heartbeat_ttl,
int);
1473 #ifdef ZMQ_IMMEDIATE 1474 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_IMMEDIATE, immediate,
int);
1476 #ifdef ZMQ_INVERT_MATCHING 1477 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_INVERT_MATCHING, invert_matching,
int);
1480 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_IPV6, ipv6,
int);
1482 #ifdef ZMQ_LAST_ENDPOINT 1483 ZMQ_DEFINE_ARRAY_OPT(ZMQ_LAST_ENDPOINT, last_endpoint);
1486 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_LINGER, linger,
int);
1488 #ifdef ZMQ_MAXMSGSIZE 1489 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MAXMSGSIZE, maxmsgsize, int64_t);
1491 #ifdef ZMQ_MECHANISM 1492 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MECHANISM, mechanism,
int);
1495 ZMQ_DEFINE_ARRAY_OPT(ZMQ_METADATA, metadata);
1497 #ifdef ZMQ_MULTICAST_HOPS 1498 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MULTICAST_HOPS, multicast_hops,
int);
1500 #ifdef ZMQ_MULTICAST_LOOP 1501 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_MULTICAST_LOOP, multicast_loop,
int);
1503 #ifdef ZMQ_MULTICAST_MAXTPDU 1504 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_MULTICAST_MAXTPDU, multicast_maxtpdu,
int);
1506 #ifdef ZMQ_PLAIN_SERVER 1507 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_PLAIN_SERVER, plain_server,
int);
1509 #ifdef ZMQ_PLAIN_PASSWORD 1510 ZMQ_DEFINE_ARRAY_OPT(ZMQ_PLAIN_PASSWORD, plain_password);
1512 #ifdef ZMQ_PLAIN_USERNAME 1513 ZMQ_DEFINE_ARRAY_OPT(ZMQ_PLAIN_USERNAME, plain_username);
1516 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_USE_FD, use_fd,
int);
1518 #ifdef ZMQ_PROBE_ROUTER 1519 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_PROBE_ROUTER, probe_router,
int);
1522 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RATE, rate,
int);
1525 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RCVBUF, rcvbuf,
int);
1528 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RCVHWM, rcvhwm,
int);
1531 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_RCVMORE, rcvmore,
int);
1534 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RCVTIMEO, rcvtimeo,
int);
1536 #ifdef ZMQ_RECONNECT_IVL 1537 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RECONNECT_IVL, reconnect_ivl,
int);
1539 #ifdef ZMQ_RECONNECT_IVL_MAX 1540 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RECONNECT_IVL_MAX, reconnect_ivl_max,
int);
1542 #ifdef ZMQ_RECOVERY_IVL 1543 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_RECOVERY_IVL, recovery_ivl,
int);
1545 #ifdef ZMQ_REQ_CORRELATE 1546 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_REQ_CORRELATE, req_correlate,
int);
1548 #ifdef ZMQ_REQ_RELAXED 1549 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_REQ_RELAXED, req_relaxed,
int);
1551 #ifdef ZMQ_ROUTER_HANDOVER 1552 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_ROUTER_HANDOVER, router_handover,
int);
1554 #ifdef ZMQ_ROUTER_MANDATORY 1555 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_ROUTER_MANDATORY, router_mandatory,
int);
1557 #ifdef ZMQ_ROUTER_NOTIFY 1558 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_ROUTER_NOTIFY, router_notify,
int);
1560 #ifdef ZMQ_ROUTING_ID 1561 ZMQ_DEFINE_ARRAY_OPT_BINARY(ZMQ_ROUTING_ID, routing_id);
1564 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_SNDBUF, sndbuf,
int);
1567 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_SNDHWM, sndhwm,
int);
1570 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_SNDTIMEO, sndtimeo,
int);
1572 #ifdef ZMQ_SOCKS_PROXY 1573 ZMQ_DEFINE_ARRAY_OPT(ZMQ_SOCKS_PROXY, socks_proxy);
1575 #ifdef ZMQ_STREAM_NOTIFY 1576 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_STREAM_NOTIFY, stream_notify,
int);
1578 #ifdef ZMQ_SUBSCRIBE 1579 ZMQ_DEFINE_ARRAY_OPT(ZMQ_SUBSCRIBE, subscribe);
1581 #ifdef ZMQ_TCP_KEEPALIVE 1582 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE, tcp_keepalive,
int);
1584 #ifdef ZMQ_TCP_KEEPALIVE_CNT 1585 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE_CNT, tcp_keepalive_cnt,
int);
1587 #ifdef ZMQ_TCP_KEEPALIVE_IDLE 1588 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE_IDLE, tcp_keepalive_idle,
int);
1590 #ifdef ZMQ_TCP_KEEPALIVE_INTVL 1591 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_KEEPALIVE_INTVL, tcp_keepalive_intvl,
int);
1593 #ifdef ZMQ_TCP_MAXRT 1594 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TCP_MAXRT, tcp_maxrt,
int);
1596 #ifdef ZMQ_THREAD_SAFE 1597 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_THREAD_SAFE, thread_safe,
int);
1600 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TOS, tos,
int);
1603 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_TYPE, type,
int);
1605 #ifdef ZMQ_UNSUBSCRIBE 1606 ZMQ_DEFINE_ARRAY_OPT(ZMQ_UNSUBSCRIBE, unsubscribe);
1608 #ifdef ZMQ_VMCI_BUFFER_SIZE 1609 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_BUFFER_SIZE, vmci_buffer_size, uint64_t);
1611 #ifdef ZMQ_VMCI_BUFFER_MIN_SIZE 1612 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_BUFFER_MIN_SIZE, vmci_buffer_min_size, uint64_t);
1614 #ifdef ZMQ_VMCI_BUFFER_MAX_SIZE 1615 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_BUFFER_MAX_SIZE, vmci_buffer_max_size, uint64_t);
1617 #ifdef ZMQ_VMCI_CONNECT_TIMEOUT 1618 ZMQ_DEFINE_INTEGRAL_OPT(ZMQ_VMCI_CONNECT_TIMEOUT, vmci_connect_timeout,
int);
1620 #ifdef ZMQ_XPUB_VERBOSE 1621 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_VERBOSE, xpub_verbose,
int);
1623 #ifdef ZMQ_XPUB_VERBOSER 1624 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_VERBOSER, xpub_verboser,
int);
1626 #ifdef ZMQ_XPUB_MANUAL 1627 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_MANUAL, xpub_manual,
int);
1629 #ifdef ZMQ_XPUB_NODROP 1630 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_XPUB_NODROP, xpub_nodrop,
int);
1632 #ifdef ZMQ_XPUB_WELCOME_MSG 1633 ZMQ_DEFINE_ARRAY_OPT(ZMQ_XPUB_WELCOME_MSG, xpub_welcome_msg);
1635 #ifdef ZMQ_ZAP_ENFORCE_DOMAIN 1636 ZMQ_DEFINE_INTEGRAL_BOOL_UNIT_OPT(ZMQ_ZAP_ENFORCE_DOMAIN, zap_enforce_domain,
int);
1638 #ifdef ZMQ_ZAP_DOMAIN 1639 ZMQ_DEFINE_ARRAY_OPT(ZMQ_ZAP_DOMAIN, zap_domain);
1654 template<
typename T>
1656 void setsockopt(
int option_, T const &optval)
1658 setsockopt(option_, &optval,
sizeof(T));
1662 void setsockopt(
int option_, const
void *optval_,
size_t optvallen_)
1664 int rc = zmq_setsockopt(_handle, option_, optval_, optvallen_);
1670 void getsockopt(
int option_,
void *optval_,
size_t *optvallen_)
const 1672 int rc = zmq_getsockopt(_handle, option_, optval_, optvallen_);
1677 template<
typename T>
1679 T getsockopt(
int option_)
const 1682 size_t optlen =
sizeof(T);
1683 getsockopt(option_, &optval, &optlen);
1690 template<
int Opt,
class T,
bool BoolUnit>
1691 void set(sockopt::integral_option<Opt, T, BoolUnit>,
const T &val)
1693 static_assert(std::is_integral<T>::value,
"T must be integral");
1694 set_option(Opt, &val,
sizeof val);
1699 template<
int Opt,
class T>
1700 void set(sockopt::integral_option<Opt, T, true>,
bool val)
1702 static_assert(std::is_integral<T>::value,
"T must be integral");
1704 set_option(Opt, &rep_val,
sizeof rep_val);
1709 template<
int Opt,
int NullTerm>
1710 void set(sockopt::array_option<Opt, NullTerm>,
const char *buf)
1712 set_option(Opt, buf, std::strlen(buf));
1717 template<
int Opt,
int NullTerm>
1718 void set(sockopt::array_option<Opt, NullTerm>, const_buffer buf)
1720 set_option(Opt, buf.data(), buf.size());
1725 template<
int Opt,
int NullTerm>
1726 void set(sockopt::array_option<Opt, NullTerm>,
const std::string &buf)
1728 set_option(Opt, buf.data(), buf.size());
1731 #if CPPZMQ_HAS_STRING_VIEW 1734 template<
int Opt,
int NullTerm>
1735 void set(sockopt::array_option<Opt, NullTerm>, std::string_view buf)
1737 set_option(Opt, buf.data(), buf.size());
1743 template<
int Opt,
class T,
bool BoolUnit>
1744 ZMQ_NODISCARD T
get(sockopt::integral_option<Opt, T, BoolUnit>)
const 1746 static_assert(std::is_integral<T>::value,
"T must be integral");
1748 size_t size =
sizeof val;
1749 get_option(Opt, &val, &size);
1750 assert(size ==
sizeof val);
1756 template<
int Opt,
int NullTerm>
1757 ZMQ_NODISCARD size_t get(sockopt::array_option<Opt, NullTerm>,
1758 mutable_buffer buf)
const 1760 size_t size = buf.size();
1761 get_option(Opt, buf.data(), &size);
1769 template<
int Opt,
int NullTerm>
1770 ZMQ_NODISCARD std::string
get(sockopt::array_option<Opt, NullTerm>,
1771 size_t init_size = 1024)
const 1774 if (init_size == 1024) {
1778 std::string str(init_size,
'\0');
1779 size_t size =
get(sockopt::array_option<Opt>{},
buffer(str));
1782 assert(str[size - 1] ==
'\0');
1786 assert(size == 32 || size == 41);
1788 assert(str[size - 1] ==
'\0');
1797 void bind(std::string
const &addr) {
bind(addr.c_str()); }
1801 int rc = zmq_bind(_handle, addr_);
1810 int rc = zmq_unbind(_handle, addr_);
1819 int rc = zmq_connect(_handle, addr_);
1828 int rc = zmq_disconnect(_handle, addr_);
1833 ZMQ_DEPRECATED(
"from 4.7.1, use handle() != nullptr or operator bool")
1837 size_t send(const
void *buf_,
size_t len_,
int flags_ = 0)
1839 int nbytes = zmq_send(_handle, buf_, len_, flags_);
1841 return static_cast<size_t>(nbytes);
1842 if (zmq_errno() == EAGAIN)
1851 int nbytes = zmq_msg_send(msg_.handle(), _handle, flags_);
1854 if (zmq_errno() == EAGAIN)
1859 template<
typename T>
1861 "from 4.4.1, use send taking message_t or buffer (for contiguous " 1862 "ranges), and send_flags")
1863 bool send(T first, T last,
int flags_ = 0)
1866 int nbytes = zmq_msg_send(msg.
handle(), _handle, flags_);
1869 if (zmq_errno() == EAGAIN)
1874 #ifdef ZMQ_HAS_RVALUE_REFS 1880 return send(msg_, static_cast<send_flags>(flags_)).has_value();
1882 return send(msg_, flags_);
1888 send_result_t send(const_buffer buf, send_flags flags = send_flags::none)
1891 zmq_send(_handle, buf.data(), buf.size(),
static_cast<int>(flags));
1893 return static_cast<size_t>(nbytes);
1894 if (zmq_errno() == EAGAIN)
1899 send_result_t send(
message_t &msg, send_flags flags)
1901 int nbytes = zmq_msg_send(msg.
handle(), _handle,
static_cast<int>(flags));
1903 return static_cast<size_t>(nbytes);
1904 if (zmq_errno() == EAGAIN)
1909 send_result_t send(
message_t &&msg, send_flags flags)
1911 return send(msg, flags);
1916 "from 4.3.1, use recv taking a mutable_buffer and recv_flags")
1917 size_t recv(
void *buf_,
size_t len_,
int flags_ = 0)
1919 int nbytes = zmq_recv(_handle, buf_, len_, flags_);
1921 return static_cast<size_t>(nbytes);
1922 if (zmq_errno() == EAGAIN)
1928 "from 4.3.1, use recv taking a reference to message_t and recv_flags")
1929 bool recv(
message_t *msg_,
int flags_ = 0)
1931 int nbytes = zmq_msg_recv(msg_->
handle(), _handle, flags_);
1934 if (zmq_errno() == EAGAIN)
1941 recv_buffer_result_t recv(mutable_buffer buf,
1942 recv_flags flags = recv_flags::none)
1945 zmq_recv(_handle, buf.data(), buf.size(),
static_cast<int>(flags));
1947 return recv_buffer_size{
1948 (std::min)(static_cast<size_t>(nbytes), buf.size()),
1949 static_cast<size_t>(nbytes)};
1951 if (zmq_errno() == EAGAIN)
1957 recv_result_t recv(
message_t &msg, recv_flags flags = recv_flags::none)
1960 zmq_msg_recv(msg.
handle(), _handle,
static_cast<int>(flags));
1962 assert(msg.
size() ==
static_cast<size_t>(nbytes));
1963 return static_cast<size_t>(nbytes);
1965 if (zmq_errno() == EAGAIN)
1971 #if defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 0) 1972 void join(
const char *group)
1974 int rc = zmq_join(_handle, group);
1979 void leave(
const char *group)
1981 int rc = zmq_leave(_handle, group);
1999 void set_option(
int option_,
const void *optval_,
size_t optvallen_)
2001 int rc = zmq_setsockopt(_handle, option_, optval_, optvallen_);
2006 void get_option(
int option_,
void *optval_,
size_t *optvallen_)
const 2008 int rc = zmq_getsockopt(_handle, option_, optval_, optvallen_);
2016 enum class socket_type : int
2020 dealer = ZMQ_DEALER,
2021 router = ZMQ_ROUTER,
2028 #if defined(ZMQ_BUILD_DRAFT_API) && ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 0) 2029 server = ZMQ_SERVER,
2030 client = ZMQ_CLIENT,
2034 #if ZMQ_VERSION_MAJOR >= 4 2035 stream = ZMQ_STREAM,
2070 return sr.handle() ==
nullptr;
2074 return sr.handle() ==
nullptr;
2078 return !(sr ==
nullptr);
2082 return !(sr ==
nullptr);
2088 return std::equal_to<const void *>()(a.handle(), b.handle());
2096 return std::less<const void *>()(a.handle(), b.handle());
2120 return hash<void *>()(sr.handle());
2136 detail::socket_base(zmq_socket(context_.handle(), type_)),
2137 ctxptr(context_.handle())
2145 socket_t(context_, static_cast<int>(type_))
2150 #ifdef ZMQ_HAS_RVALUE_REFS 2177 int rc = zmq_close(_handle);
2199 detail::socket_base(zmq_socket(context_, type_)), ctxptr(context_)
2213 ZMQ_DEPRECATED(
"from 4.3.1, use proxy taking socket_t objects")
2214 inline
void proxy(
void *frontend,
void *backend,
void *capture)
2216 int rc = zmq_proxy(frontend, backend, capture);
2224 int rc = zmq_proxy(frontend.handle(), backend.handle(), capture.handle());
2229 #ifdef ZMQ_HAS_PROXY_STEERABLE 2230 ZMQ_DEPRECATED(
"from 4.3.1, use proxy_steerable taking socket_t objects")
2234 int rc = zmq_proxy_steerable(frontend, backend, capture, control);
2244 int rc = zmq_proxy_steerable(frontend.handle(), backend.handle(),
2245 capture.handle(), control.handle());
2258 #ifdef ZMQ_HAS_RVALUE_REFS 2262 std::swap(_monitor_socket, rhs._monitor_socket);
2270 std::swap(_monitor_socket, rhs._monitor_socket);
2279 monitor(socket, addr.c_str(), events);
2284 init(socket, addr_, events);
2290 void init(
socket_t &socket, std::string
const &addr,
int events = ZMQ_EVENT_ALL)
2292 init(socket, addr.c_str(), events);
2297 int rc = zmq_socket_monitor(socket.handle(), addr_, events);
2303 _monitor_socket.connect(addr_);
2305 on_monitor_started();
2310 assert(_monitor_socket);
2315 {_monitor_socket.
handle(), 0, ZMQ_POLLIN, 0},
2320 if (items[0].revents & ZMQ_POLLIN) {
2321 int rc = zmq_msg_recv(eventMsg.
handle(), _monitor_socket.handle(), 0);
2322 if (rc == -1 && zmq_errno() == ETERM)
2330 #if ZMQ_VERSION_MAJOR >= 4 2331 const char *
data =
static_cast<const char *
>(eventMsg.
data());
2333 memcpy(&msgEvent.
event, data,
sizeof(uint16_t));
2334 data +=
sizeof(uint16_t);
2335 memcpy(&msgEvent.
value, data,
sizeof(int32_t));
2341 #ifdef ZMQ_NEW_MONITOR_EVENT_LAYOUT 2343 int rc = zmq_msg_recv(addrMsg.
handle(), _monitor_socket.handle(), 0);
2344 if (rc == -1 && zmq_errno() == ETERM) {
2349 std::string address = addrMsg.
to_string();
2352 std::string address =
event->data.connected.addr;
2355 #ifdef ZMQ_EVENT_MONITOR_STOPPED 2356 if (event->event == ZMQ_EVENT_MONITOR_STOPPED) {
2362 switch (event->event) {
2363 case ZMQ_EVENT_CONNECTED:
2364 on_event_connected(*event, address.c_str());
2366 case ZMQ_EVENT_CONNECT_DELAYED:
2367 on_event_connect_delayed(*event, address.c_str());
2369 case ZMQ_EVENT_CONNECT_RETRIED:
2370 on_event_connect_retried(*event, address.c_str());
2372 case ZMQ_EVENT_LISTENING:
2373 on_event_listening(*event, address.c_str());
2375 case ZMQ_EVENT_BIND_FAILED:
2376 on_event_bind_failed(*event, address.c_str());
2378 case ZMQ_EVENT_ACCEPTED:
2379 on_event_accepted(*event, address.c_str());
2381 case ZMQ_EVENT_ACCEPT_FAILED:
2382 on_event_accept_failed(*event, address.c_str());
2384 case ZMQ_EVENT_CLOSED:
2385 on_event_closed(*event, address.c_str());
2387 case ZMQ_EVENT_CLOSE_FAILED:
2388 on_event_close_failed(*event, address.c_str());
2390 case ZMQ_EVENT_DISCONNECTED:
2391 on_event_disconnected(*event, address.c_str());
2393 #ifdef ZMQ_BUILD_DRAFT_API 2394 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 3) 2395 case ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL:
2396 on_event_handshake_failed_no_detail(*event, address.c_str());
2398 case ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL:
2399 on_event_handshake_failed_protocol(*event, address.c_str());
2401 case ZMQ_EVENT_HANDSHAKE_FAILED_AUTH:
2402 on_event_handshake_failed_auth(*event, address.c_str());
2404 case ZMQ_EVENT_HANDSHAKE_SUCCEEDED:
2405 on_event_handshake_succeeded(*event, address.c_str());
2407 #elif ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 1) 2408 case ZMQ_EVENT_HANDSHAKE_FAILED:
2409 on_event_handshake_failed(*event, address.c_str());
2411 case ZMQ_EVENT_HANDSHAKE_SUCCEED:
2412 on_event_handshake_succeed(*event, address.c_str());
2417 on_event_unknown(*event, address.c_str());
2424 #ifdef ZMQ_EVENT_MONITOR_STOPPED 2428 zmq_socket_monitor(_socket.handle(),
ZMQ_NULLPTR, 0);
2486 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 3) 2511 #elif ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 1) 2512 virtual void on_event_handshake_failed(
const zmq_event_t &event_,
2518 virtual void on_event_handshake_succeed(
const zmq_event_t &event_,
2541 zmq_socket_monitor(_socket.handle(),
ZMQ_NULLPTR, 0);
2542 _monitor_socket.
close();
2546 #if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER) 2549 enum class event_flags : short
2552 pollin = ZMQ_POLLIN,
2553 pollout = ZMQ_POLLOUT,
2554 pollerr = ZMQ_POLLERR,
2555 pollpri = ZMQ_POLLPRI
2558 constexpr event_flags operator|(event_flags a, event_flags b) noexcept
2560 return detail::enum_bit_or(a, b);
2562 constexpr event_flags operator&(event_flags a, event_flags b) noexcept
2564 return detail::enum_bit_and(a, b);
2566 constexpr event_flags operator^(event_flags a, event_flags b) noexcept
2568 return detail::enum_bit_xor(a, b);
2570 constexpr event_flags operator~(event_flags a) noexcept
2572 return detail::enum_bit_not(a);
2575 struct no_user_data;
2578 template<
class T = no_user_data>
struct poller_event
2586 template<
typename T = no_user_data>
class poller_t
2589 using event_type = poller_event<T>;
2591 poller_t() : poller_ptr(zmq_poller_new())
2598 typename Dummy = void,
2600 typename std::enable_if<!std::is_same<T, no_user_data>::value, Dummy>::type>
2603 add_impl(socket, events, user_data);
2608 add_impl(socket, events,
nullptr);
2613 if (0 != zmq_poller_remove(poller_ptr.get(), socket.handle())) {
2621 != zmq_poller_modify(poller_ptr.get(), socket.handle(),
2622 static_cast<short>(events))) {
2627 size_t wait_all(std::vector<event_type> &poller_events,
2628 const std::chrono::milliseconds timeout)
2630 int rc = zmq_poller_wait_all(
2632 reinterpret_cast<zmq_poller_event_t *
>(poller_events.data()),
2633 static_cast<int>(poller_events.size()),
2634 static_cast<long>(timeout.count()));
2636 return static_cast<size_t>(rc);
2638 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 2, 3) 2639 if (zmq_errno() == EAGAIN)
2641 if (zmq_errno() == ETIMEDOUT)
2648 #if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 3) 2649 size_t size()
const noexcept
2651 int rc = zmq_poller_size(const_cast<void *>(poller_ptr.get()));
2653 return static_cast<size_t>(std::max(rc, 0));
2658 struct destroy_poller_t
2660 void operator()(
void *ptr) noexcept
2662 int rc = zmq_poller_destroy(&ptr);
2667 std::unique_ptr<void, destroy_poller_t> poller_ptr;
2669 void add_impl(
zmq::socket_ref socket, event_flags events, T *user_data)
2672 != zmq_poller_add(poller_ptr.get(), socket.handle(), user_data,
2673 static_cast<short>(events))) {
2678 #endif // defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_CPP11) && defined(ZMQ_HAVE_POLLER) 2682 return os << msg.
str();
2687 #endif // __ZMQ_HPP_INCLUDED__ void monitor(socket_t &socket, const char *addr_, int events=ZMQ_EVENT_ALL)
void swap(context_t &other) ZMQ_NOTHROW
typename std::enable_if< Predicate::value >::type * enable_if
const T * data(const std::vector< T, Alloc > &v)
#define ZMQ_DELETED_FUNCTION
context_t(int io_threads_, int max_sockets_=ZMQ_MAX_SOCKETS_DFLT)
ZMQ_CONSTEXPR_FN ZMQ_EXPLICIT from_handle_t(_private) ZMQ_NOTHROW
socket_t(void *context_, int type_)
virtual const char * what() const ZMQ_NOTHROW ZMQ_OVERRIDE
ZMQ_NODISCARD const zmq_msg_t * handle() const ZMQ_NOTHROW
bool operator<(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
void monitor(socket_t &socket, std::string const &addr, int events=ZMQ_EVENT_ALL)
virtual void on_event_handshake_failed_protocol(const zmq_event_t &event_, const char *addr_)
zmq_pollitem_t pollitem_t
virtual void on_event_connect_delayed(const zmq_event_t &event_, const char *addr_)
static raw_event_t * buffer
std::ostream & operator<<(std::ostream &os, const message_t &msg)
const char * gets(const char *property_)
void swap(socket_t &other) ZMQ_NOTHROW
void bind(const char *addr_)
virtual void on_event_closed(const zmq_event_t &event_, const char *addr_)
virtual void on_event_disconnected(const zmq_event_t &event_, const char *addr_)
virtual void on_event_accepted(const zmq_event_t &event_, const char *addr_)
void rebuild(const void *data_, size_t size_)
message_t(const void *data_, size_t size_)
void swap(linb::any &lhs, linb::any &rhs) noexcept
ZMQ_NODISCARD void * handle() ZMQ_NOTHROW
#define ZMQ_ASSERT(expression)
ZMQ_NODISCARD bool empty() const ZMQ_NOTHROW
basic_string_view< CharT, Traits > to_string_view(std::basic_string< CharT, Traits, Allocator > const &s)
void unbind(std::string const &addr)
void disconnect(const char *addr_)
bool operator>=(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
std::string to_string() const
virtual void on_event_handshake_succeeded(const zmq_event_t &event_, const char *addr_)
ZMQ_NODISCARD zmq_msg_t * handle() ZMQ_NOTHROW
T const * data() const ZMQ_NOTHROW
ZMQ_EXPLICIT socket_base(void *handle) ZMQ_NOTHROW
void proxy_steerable(void *frontend, void *backend, void *capture, void *control)
void * data() ZMQ_NOTHROW
#define ZMQ_CONSTEXPR_VAR
int poll(zmq_pollitem_t *items_, size_t nitems_, long timeout_=-1)
void proxy(void *frontend, void *backend, void *capture)
virtual void on_event_handshake_failed_auth(const zmq_event_t &event_, const char *addr_)
void move(message_t &msg_)
const void * data() const ZMQ_NOTHROW
void set_option(int option_, const void *optval_, size_t optvallen_)
void copy(message_t &msg_)
void init(socket_t &socket, const char *addr_, int events=ZMQ_EVENT_ALL)
bool operator>(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
bool check_event(int timeout=0)
message_t(ForwardIter first, ForwardIter last)
virtual void on_event_close_failed(const zmq_event_t &event_, const char *addr_)
virtual void on_event_handshake_failed_no_detail(const zmq_event_t &event_, const char *addr_)
int num() const ZMQ_NOTHROW
message_t(void *data_, size_t size_, free_fn *ffn_, void *hint_=ZMQ_NULLPTR)
socket_base() ZMQ_NOTHROW
virtual void on_event_unknown(const zmq_event_t &event_, const char *addr_)
socket_t(context_t &context_, int type_)
void rebuild(size_t size_)
bool operator<=(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
bool operator==(const message_t &other) const ZMQ_NOTHROW
virtual void on_event_listening(const zmq_event_t &event_, const char *addr_)
void version(int *major_, int *minor_, int *patch_)
virtual void on_event_connected(const zmq_event_t &event_, const char *addr_)
void connect(std::string const &addr)
bool operator==(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
socket_ref(from_handle_t, void *handle) ZMQ_NOTHROW
bool operator!=(const message_t &other) const ZMQ_NOTHROW
void connect(const char *addr_)
void swap(message_t &a, message_t &b) ZMQ_NOTHROW
void shutdown() ZMQ_NOTHROW
size_t size() const ZMQ_NOTHROW
void bind(std::string const &addr)
void rebuild(void *data_, size_t size_, free_fn *ffn_, void *hint_=ZMQ_NULLPTR)
bool operator!=(const detail::socket_base &a, const detail::socket_base &b) ZMQ_NOTHROW
virtual void on_monitor_started()
virtual void on_event_bind_failed(const zmq_event_t &event_, const char *addr_)
void init(socket_t &socket, std::string const &addr, int events=ZMQ_EVENT_ALL)
#define ZMQ_CPP11_DEPRECATED(msg)
virtual void on_event_accept_failed(const zmq_event_t &event_, const char *addr_)
void get_option(int option_, void *optval_, size_t *optvallen_) const
void disconnect(std::string const &addr)
void swap(message_t &other) ZMQ_NOTHROW
void unbind(const char *addr_)
virtual void on_event_connect_retried(const zmq_event_t &event_, const char *addr_)
error_t(int err) ZMQ_NOTHROW
ZMQ_CONSTEXPR_VAR from_handle_t from_handle
bool more() const ZMQ_NOTHROW