17 #if !defined ZMQ_HAVE_WINDOWS
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <arpa/inet.h>
22 #include <netinet/tcp.h>
23 #include <netinet/in.h>
26 #ifdef ZMQ_HAVE_VXWORKS
29 #ifdef ZMQ_HAVE_OPENVMS
35 #include <TargetConditionals.h>
38 zmq::tcp_connecter_t::tcp_connecter_t (
class io_thread_t *io_thread_,
39 class session_base_t *session_,
42 bool delayed_start_) :
43 stream_connecter_base_t (
44 io_thread_, session_,
options_, addr_, delayed_start_),
45 _connect_timer_started (
false)
50 zmq::tcp_connecter_t::~tcp_connecter_t ()
55 void zmq::tcp_connecter_t::process_term (
int linger_)
57 if (_connect_timer_started) {
58 cancel_timer (connect_timer_id);
59 _connect_timer_started =
false;
65 void zmq::tcp_connecter_t::out_event ()
67 if (_connect_timer_started) {
68 cancel_timer (connect_timer_id);
69 _connect_timer_started =
false;
77 const fd_t fd = connect ();
82 send_conn_failed (_session);
91 add_reconnect_timer ();
98 void zmq::tcp_connecter_t::timer_event (
int id_)
100 if (id_ == connect_timer_id) {
101 _connect_timer_started =
false;
104 add_reconnect_timer ();
109 void zmq::tcp_connecter_t::start_connecting ()
112 const int rc = open ();
116 _handle = add_fd (_s);
122 _handle = add_fd (_s);
123 set_pollout (_handle);
124 _socket->event_connect_delayed (
128 add_connect_timer ();
135 add_reconnect_timer ();
139 void zmq::tcp_connecter_t::add_connect_timer ()
141 if (
options.connect_timeout > 0) {
142 add_timer (
options.connect_timeout, connect_timer_id);
143 _connect_timer_started =
true;
147 int zmq::tcp_connecter_t::open ()
152 if (_addr->resolved.tcp_addr !=
NULL) {
156 _addr->resolved.tcp_addr =
new (std::nothrow) tcp_address_t ();
159 _addr->resolved.tcp_addr);
171 const tcp_address_t *
const tcp_addr = _addr->resolved.tcp_addr;
176 if (tcp_addr->has_src_addr ()) {
180 #ifdef ZMQ_HAVE_WINDOWS
181 rc = setsockopt (_s, SOL_SOCKET, SO_REUSEADDR,
182 reinterpret_cast<const char *
> (&flag),
sizeof (
int));
183 wsa_assert (rc != SOCKET_ERROR);
184 #elif defined ZMQ_HAVE_VXWORKS
185 rc = setsockopt (_s, SOL_SOCKET, SO_REUSEADDR, (
char *) &flag,
189 rc = setsockopt (_s, SOL_SOCKET, SO_REUSEADDR, &flag,
sizeof (
int));
193 #if defined ZMQ_HAVE_VXWORKS
194 rc = ::bind (_s, (sockaddr *) tcp_addr->src_addr (),
195 tcp_addr->src_addrlen ());
197 rc = ::bind (_s, tcp_addr->src_addr (), tcp_addr->src_addrlen ());
204 #if defined ZMQ_HAVE_VXWORKS
205 rc = ::connect (_s, (sockaddr *) tcp_addr->addr (), tcp_addr->addrlen ());
207 rc = ::connect (_s, tcp_addr->addr (), tcp_addr->addrlen ());
216 #ifdef ZMQ_HAVE_WINDOWS
217 const int last_error = WSAGetLastError ();
218 if (last_error == WSAEINPROGRESS || last_error == WSAEWOULDBLOCK)
221 errno = wsa_error_to_errno (last_error);
229 zmq::fd_t zmq::tcp_connecter_t::connect ()
233 #if defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_VXWORKS
236 socklen_t
len =
sizeof err;
239 const int rc = getsockopt (_s, SOL_SOCKET, SO_ERROR,
240 reinterpret_cast<char *
> (&
err), &
len);
244 #ifdef ZMQ_HAVE_WINDOWS
247 if (
err == WSAEBADF ||
err == WSAENOPROTOOPT ||
err == WSAENOTSOCK
248 ||
err == WSAENOBUFS) {
261 #if !defined(TARGET_OS_IPHONE) || !TARGET_OS_IPHONE
273 const fd_t result = _s;
278 bool zmq::tcp_connecter_t::tune_socket (
const fd_t fd_)