7 #if defined ZMQ_HAVE_VMCI
12 #include "platform.hpp"
21 zmq::vmci_connecter_t::vmci_connecter_t (
class io_thread_t *io_thread_,
22 class session_base_t *session_,
25 bool delayed_start_) :
26 stream_connecter_base_t (
27 io_thread_, session_,
options_, addr_, delayed_start_),
28 _connect_timer_started (
false)
30 zmq_assert (_addr->protocol == protocol_name::vmci);
33 zmq::vmci_connecter_t::~vmci_connecter_t ()
38 void zmq::vmci_connecter_t::process_term (
int linger_)
40 if (_connect_timer_started) {
41 cancel_timer (connect_timer_id);
42 _connect_timer_started =
false;
45 stream_connecter_base_t::process_term (linger_);
48 void zmq::vmci_connecter_t::in_event ()
56 void zmq::vmci_connecter_t::out_event ()
58 if (_connect_timer_started) {
59 cancel_timer (connect_timer_id);
60 _connect_timer_started =
false;
68 const fd_t fd = connect ();
73 send_conn_failed (_session);
82 add_reconnect_timer ();
86 tune_vmci_buffer_size (this->get_ctx (), fd,
options.vmci_buffer_size,
90 if (
options.vmci_connect_timeout > 0) {
91 #if defined ZMQ_HAVE_WINDOWS
92 tune_vmci_connect_timeout (this->get_ctx (), fd,
96 tune_vmci_connect_timeout (this->get_ctx (), fd,
timeout);
108 struct sockaddr_storage ss;
114 const vmci_address_t addr (
reinterpret_cast<struct sockaddr *
> (&ss), sl,
117 addr.to_string (address_string);
118 return address_string;
121 void zmq::vmci_connecter_t::timer_event (
int id_)
123 if (id_ == connect_timer_id) {
124 _connect_timer_started =
false;
127 add_reconnect_timer ();
129 stream_connecter_base_t::timer_event (id_);
132 void zmq::vmci_connecter_t::start_connecting ()
135 const int rc = open ();
139 _handle = add_fd (_s);
145 _handle = add_fd (_s);
146 set_pollout (_handle);
147 _socket->event_connect_delayed (
151 add_connect_timer ();
158 add_reconnect_timer ();
162 void zmq::vmci_connecter_t::add_connect_timer ()
164 if (
options.connect_timeout > 0) {
165 add_timer (
options.connect_timeout, connect_timer_id);
166 _connect_timer_started =
true;
170 int zmq::vmci_connecter_t::open ()
175 if (_addr->resolved.vmci_addr !=
NULL) {
179 _addr->resolved.vmci_addr =
180 new (std::nothrow) vmci_address_t (this->get_ctx ());
182 _s = vmci_open_socket (_addr->address.c_str (),
options,
183 _addr->resolved.vmci_addr);
195 const vmci_address_t *
const vmci_addr = _addr->resolved.vmci_addr;
200 #if defined ZMQ_HAVE_VXWORKS
201 rc = ::connect (_s, (sockaddr *) vmci_addr->addr (), vmci_addr->addrlen ());
203 rc = ::connect (_s, vmci_addr->addr (), vmci_addr->addrlen ());
212 #ifdef ZMQ_HAVE_WINDOWS
213 const int last_error = WSAGetLastError ();
214 if (last_error == WSAEINPROGRESS || last_error == WSAEWOULDBLOCK)
217 errno = wsa_error_to_errno (last_error);
225 zmq::fd_t zmq::vmci_connecter_t::connect ()
229 #if defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_VXWORKS
232 socklen_t
len =
sizeof err;
235 const int rc = getsockopt (_s, SOL_SOCKET, SO_ERROR,
236 reinterpret_cast<char *
> (&
err), &
len);
240 #ifdef ZMQ_HAVE_WINDOWS
243 if (
err == WSAEBADF ||
err == WSAENOPROTOOPT ||
err == WSAENOTSOCK
244 ||
err == WSAENOBUFS) {
257 #if !defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE
269 const fd_t result = _s;