23 #if !defined ZMQ_HAVE_WINDOWS
25 #include <sys/types.h>
26 #include <sys/socket.h>
27 #include <arpa/inet.h>
28 #include <netinet/tcp.h>
29 #include <netinet/in.h>
32 #ifdef ZMQ_HAVE_VXWORKS
35 #ifdef ZMQ_HAVE_OPENVMS
41 #include <TargetConditionals.h>
44 zmq::ws_connecter_t::ws_connecter_t (
class io_thread_t *io_thread_,
45 class session_base_t *session_,
51 stream_connecter_base_t (
52 io_thread_, session_,
options_, addr_, delayed_start_),
53 _connect_timer_started (
false),
55 _hostname (tls_hostname_)
59 zmq::ws_connecter_t::~ws_connecter_t ()
64 void zmq::ws_connecter_t::process_term (
int linger_)
66 if (_connect_timer_started) {
67 cancel_timer (connect_timer_id);
68 _connect_timer_started =
false;
74 void zmq::ws_connecter_t::out_event ()
76 if (_connect_timer_started) {
77 cancel_timer (connect_timer_id);
78 _connect_timer_started =
false;
86 const fd_t fd = connect ();
91 add_reconnect_timer ();
107 void zmq::ws_connecter_t::timer_event (
int id_)
109 if (id_ == connect_timer_id) {
110 _connect_timer_started =
false;
113 add_reconnect_timer ();
118 void zmq::ws_connecter_t::start_connecting ()
121 const int rc = open ();
125 _handle = add_fd (_s);
131 _handle = add_fd (_s);
132 set_pollout (_handle);
133 _socket->event_connect_delayed (
137 add_connect_timer ();
144 add_reconnect_timer ();
148 void zmq::ws_connecter_t::add_connect_timer ()
150 if (
options.connect_timeout > 0) {
151 add_timer (
options.connect_timeout, connect_timer_id);
152 _connect_timer_started =
true;
156 int zmq::ws_connecter_t::open ()
160 tcp_address_t tcp_addr;
170 #ifdef ZMQ_HAVE_VXWORKS
171 int rc = ::connect (_s, (sockaddr *) tcp_addr.addr (), tcp_addr.addrlen ());
173 const int rc = ::connect (_s, tcp_addr.addr (), tcp_addr.addrlen ());
182 #ifdef ZMQ_HAVE_WINDOWS
183 const int last_error = WSAGetLastError ();
184 if (last_error == WSAEINPROGRESS || last_error == WSAEWOULDBLOCK)
187 errno = wsa_error_to_errno (last_error);
195 zmq::fd_t zmq::ws_connecter_t::connect ()
199 #if defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_VXWORKS
202 socklen_t
len =
sizeof err;
205 const int rc = getsockopt (_s, SOL_SOCKET, SO_ERROR,
206 reinterpret_cast<char *
> (&
err), &
len);
210 #ifdef ZMQ_HAVE_WINDOWS
213 if (
err == WSAEBADF ||
err == WSAENOPROTOOPT ||
err == WSAENOTSOCK
214 ||
err == WSAENOBUFS) {
226 #if !defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE
238 const fd_t result = _s;
243 bool zmq::ws_connecter_t::tune_socket (
const fd_t fd_)
250 void zmq::ws_connecter_t::create_engine (
fd_t fd_,
253 const endpoint_uri_pair_t endpoint_pair (local_address_, _endpoint,
257 i_engine *engine =
NULL;
260 engine =
new (std::nothrow)
261 wss_engine_t (fd_,
options, endpoint_pair, *_addr->resolved.ws_addr,
262 true,
NULL, _hostname);
268 engine =
new (std::nothrow) ws_engine_t (
269 fd_,
options, endpoint_pair, *_addr->resolved.ws_addr,
true);
273 send_attach (_session, engine);
278 _socket->event_connected (endpoint_pair, fd_);