PageRenderTime 52ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/src/zmqh/socket.cpp

https://gitlab.com/MujibAzizi/libzhelper
C++ | 159 lines | 75 code | 21 blank | 63 comment | 23 complexity | 9ff598a25774d74b7e6fd1d3a40e0653 MD5 | raw file
  1. /**
  2. * @file
  3. * @date 13 oct. 2010
  4. * @todo comment
  5. */
  6. #include "zmqh/socket.hpp"
  7. #include "zmqh/context.hpp"
  8. #include "zmqh/message.hpp"
  9. #include "zmqh/multipart.hpp"
  10. #include "zmqh/option.hpp"
  11. #include <iostream>
  12. #include <sstream>
  13. #include <iomanip>
  14. #include <algorithm>
  15. namespace zmqh {
  16. namespace socket {
  17. socket_base::socket_base(void const* socket_ptr_in) :
  18. __socket_ptr(socket_ptr_in), __block(true) {
  19. }
  20. socket_base::~socket_base() throw (::zmqh::error_t) {
  21. if (zmq_close(*this) != 0) {
  22. throw ::zmqh::error_t();
  23. }
  24. }
  25. socket_base::operator void*() const {
  26. return const_cast< void* > (__socket_ptr);
  27. }
  28. // void socket_base::setsockopt(int option_, const void* optval_,
  29. // size_t optvallen_) throw(::zmqh::error_t) {
  30. // int rc = zmq_setsockopt(*this, option_, optval_, optvallen_);
  31. // if (rc != 0) {
  32. // throw ::zmqh::error_t();
  33. // }
  34. // }
  35. //
  36. // void socket_base::getsockopt(int option_, void* optval_, size_t *optvallen_) throw(::zmqh::error_t) {
  37. // int rc = zmq_getsockopt(*this, option_, optval_, optvallen_);
  38. // if (rc != 0) {
  39. // throw ::zmqh::error_t();
  40. // }
  41. // }
  42. void socket_base::set_id() {
  43. ::std::ostringstream stream;
  44. stream << ::std::hex << ::std::setfill('0') << ::std::setw(4) << (int) ((float) (0x10000) * random() / (RAND_MAX
  45. + 1.0));
  46. stream << '-';
  47. stream << ::std::hex << ::std::setfill('0') << ::std::setw(4) << (int) ((float) (0x10000) * random() / (RAND_MAX
  48. + 1.0));
  49. set_option< ::zmqh::identity > (stream.str());
  50. }
  51. void socket_base::bind(const ::std::string& address_in) throw (::zmqh::error_t) {
  52. int rc = zmq_bind(*this, address_in.c_str());
  53. if (rc != 0) {
  54. throw ::zmqh::error_t();
  55. }
  56. }
  57. void socket_base::connect(const ::std::string& address_in) throw (::zmqh::error_t) {
  58. int rc = zmq_connect(*this, address_in.c_str());
  59. if (rc != 0) {
  60. throw ::zmqh::error_t();
  61. }
  62. }
  63. bool socket_base::recv(mode const mode_in, message_t& message_out) throw (::zmqh::error_t) {
  64. int rc = zmq_recv(*this, &message_out, static_cast< int > (mode_in));
  65. if (rc == 0) {
  66. return true;
  67. }
  68. if (mode_in == mode::NO_BLOCK && rc == -1 && zmq_errno() == EAGAIN) {
  69. return false;
  70. }
  71. throw ::zmqh::error_t();
  72. }
  73. bool socket_base::send(mode const mode_in, message_t const& message_in, bool const send_more_in = false)
  74. throw (::zmqh::error_t) {
  75. int flags = (send_more_in ? ZMQ_SNDMORE : 0);
  76. flags |= static_cast< int > (mode_in);
  77. int rc = zmq_send(*this, &const_cast< message_t& > (message_in), flags);
  78. if (rc == 0) {
  79. return true;
  80. }
  81. if (mode_in == mode::NO_BLOCK && rc == -1 && zmq_errno() == EAGAIN) {
  82. return false;
  83. }
  84. throw ::zmqh::error_t();
  85. }
  86. void socket_base::dump() throw (::zmqh::error_t) {
  87. do {
  88. message_t message;
  89. recv(mode::NO_BLOCK, message);
  90. ::std::wcout << message.data< string_t > () << ::std::endl;
  91. } while (socket_base::option< receive_more >());
  92. }
  93. // struct part_sender: ::std::unary_function< binary_t, void > {
  94. // part_sender(socket_base& socket_in) :
  95. // socket_(socket_in) {
  96. // }
  97. //
  98. // void operator()(binary_t const& data_in) {
  99. // socket_.send(message_t(data_in), ZMQ_SNDMORE);
  100. // }
  101. //
  102. // socket_base& socket_;
  103. // };
  104. //
  105. // template< >
  106. // bool socket_base::send< multipart >(multipart const& multipart_in) {
  107. // ::std::vector< binary_t > const& addresses = multipart_in.addresses();
  108. // ::std::vector< binary_t > const& bodies = multipart_in.bodies();
  109. //
  110. // ::std::for_each(addresses.begin(), addresses.end(), part_sender(*this));
  111. // send();
  112. // ::std::for_each(bodies.begin(), bodies.end() - 1, part_sender(*this));
  113. // return send(*(bodies.end() - 1));
  114. // }
  115. //
  116. // template< >
  117. // multipart socket_base::recv< multipart >() {
  118. // multipart multipart;
  119. //
  120. // bool receiving_addresses = true;
  121. // do {
  122. // binary_t binary = recv< binary_t > ();
  123. //
  124. // if (binary.size() == 0) {
  125. // receiving_addresses = false;
  126. // } else {
  127. // if (receiving_addresses) {
  128. // multipart.add_address(binary);
  129. // } else {
  130. // multipart.add_body(binary);
  131. // }
  132. // }
  133. // } while (option< receive_more > ());
  134. //
  135. // return multipart;
  136. // }
  137. } // namespace socket
  138. } // namespace zmqh