18 #ifndef ZMQ_HAVE_WINDOWS
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
31 #ifdef ZMQ_HAVE_OPENVMS
35 zmq::tcp_listener_t::tcp_listener_t (io_thread_t *io_thread_,
36 socket_base_t *socket_,
38 stream_listener_base_t (io_thread_, socket_,
options_)
42 void zmq::tcp_listener_t::in_event ()
44 const fd_t fd = accept ();
49 _socket->event_accept_failed (
61 _socket->event_accept_failed (
74 return zmq::get_socket_name<tcp_address_t> (fd_, socket_end_);
77 int zmq::tcp_listener_t::create_socket (
const char *addr_)
90 #ifdef ZMQ_HAVE_WINDOWS
96 rc = setsockopt (_s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,
97 reinterpret_cast<const char *
> (&flag),
sizeof (
int));
98 wsa_assert (rc != SOCKET_ERROR);
99 #elif defined ZMQ_HAVE_VXWORKS
101 setsockopt (_s, SOL_SOCKET, SO_REUSEADDR, (
char *) &flag,
sizeof (
int));
104 rc = setsockopt (_s, SOL_SOCKET, SO_REUSEADDR, &flag,
sizeof (
int));
109 #if defined ZMQ_HAVE_VXWORKS
110 rc = bind (_s, (sockaddr *) _address.addr (), _address.addrlen ());
112 rc = bind (_s, _address.addr (), _address.addrlen ());
114 #ifdef ZMQ_HAVE_WINDOWS
115 if (rc == SOCKET_ERROR) {
116 errno = wsa_error_to_errno (WSAGetLastError ());
125 rc = listen (_s,
options.backlog);
126 #ifdef ZMQ_HAVE_WINDOWS
127 if (rc == SOCKET_ERROR) {
128 errno = wsa_error_to_errno (WSAGetLastError ());
145 int zmq::tcp_listener_t::set_local_address (
const char *addr_)
152 if (create_socket (addr_) == -1)
170 struct sockaddr_storage ss;
171 memset (&ss, 0,
sizeof (ss));
172 #if defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_VXWORKS
173 int ss_len =
sizeof (ss);
175 socklen_t ss_len =
sizeof (ss);
177 #if defined ZMQ_HAVE_SOCK_CLOEXEC && defined HAVE_ACCEPT4
178 fd_t sock = ::accept4 (_s,
reinterpret_cast<struct sockaddr *
> (&ss),
179 &ss_len, SOCK_CLOEXEC);
182 ::accept (_s,
reinterpret_cast<struct sockaddr *
> (&ss), &ss_len);
186 #if defined ZMQ_HAVE_WINDOWS
187 const int last_error = WSAGetLastError ();
188 wsa_assert (last_error == WSAEWOULDBLOCK || last_error == WSAECONNRESET
189 || last_error == WSAEMFILE || last_error == WSAENOBUFS);
190 #elif defined ZMQ_HAVE_ANDROID
206 if (!
options.tcp_accept_filters.empty ()) {
207 bool matched =
false;
208 for (options_t::tcp_accept_filters_t::size_type
212 if (
options.tcp_accept_filters[
i].match_address (
213 reinterpret_cast<struct sockaddr *
> (&ss), ss_len)) {
219 #ifdef ZMQ_HAVE_WINDOWS
221 wsa_assert (rc != SOCKET_ERROR);
223 int rc = ::close (
sock);
231 #ifdef ZMQ_HAVE_WINDOWS
233 wsa_assert (rc != SOCKET_ERROR);
235 int rc = ::close (
sock);