32 #if defined ZMQ_HAVE_VMCI 46 #if defined ZMQ_HAVE_WINDOWS 53 zmq::vmci_listener_t::vmci_listener_t (io_thread_t *io_thread_,
54 socket_base_t *socket_,
const options_t &options_) :
55 own_t (io_thread_, options_),
56 io_object_t (io_thread_),
62 zmq::vmci_listener_t::~vmci_listener_t ()
67 void zmq::vmci_listener_t::process_plug ()
74 void zmq::vmci_listener_t::process_term (
int linger_)
81 void zmq::vmci_listener_t::in_event ()
87 socket->event_accept_failed (endpoint,
zmq_errno());
91 tune_vmci_buffer_size (this->get_ctx (), fd, options.vmci_buffer_size, options.vmci_buffer_min_size, options.vmci_buffer_max_size);
93 if (options.vmci_connect_timeout > 0)
95 #if defined ZMQ_HAVE_WINDOWS 96 tune_vmci_connect_timeout (this->get_ctx (), fd, options.vmci_connect_timeout);
98 struct timeval timeout = {0, options.vmci_connect_timeout * 1000};
99 tune_vmci_connect_timeout (this->get_ctx (), fd, timeout);
104 stream_engine_t *engine =
new (std::nothrow)
105 stream_engine_t (fd, options, endpoint);
110 io_thread_t *io_thread = choose_io_thread (options.affinity);
117 session->inc_seqnum ();
118 launch_child (session);
119 send_attach (session, engine,
false);
120 socket->event_accepted (endpoint, fd);
123 int zmq::vmci_listener_t::get_address (std::string &addr_)
125 struct sockaddr_storage ss;
127 int sl =
sizeof (ss);
129 socklen_t sl =
sizeof (ss);
131 int rc = getsockname (s, (sockaddr *) &ss, &sl);
137 vmci_address_t addr ((
struct sockaddr *) &ss, sl, this->get_ctx ());
138 return addr.to_string (addr_);
141 int zmq::vmci_listener_t::set_address (
const char *addr_)
144 std::string addr (addr_);
147 vmci_address_t
address(this->get_ctx ());
148 int rc =
address.resolve (addr.c_str());
153 s =
open_socket (this->get_ctx ()->get_vmci_socket_family (), SOCK_STREAM, 0);
154 #ifdef ZMQ_HAVE_WINDOWS 155 if (s == INVALID_SOCKET) {
156 errno = wsa_error_to_errno(WSAGetLastError());
159 #if !defined _WIN32_WCE 161 BOOL brc = SetHandleInformation((HANDLE)s, HANDLE_FLAG_INHERIT, 0);
173 #ifdef ZMQ_HAVE_WINDOWS 174 if (rc == SOCKET_ERROR) {
175 errno = wsa_error_to_errno(WSAGetLastError());
184 rc = listen (s, options.backlog);
185 #ifdef ZMQ_HAVE_WINDOWS 186 if (rc == SOCKET_ERROR) {
187 errno = wsa_error_to_errno(WSAGetLastError());
195 socket->event_listening (endpoint, s);
205 void zmq::vmci_listener_t::close ()
208 #ifdef ZMQ_HAVE_WINDOWS 209 int rc = closesocket (s);
210 wsa_assert (rc != SOCKET_ERROR);
212 int rc = ::close (s);
215 socket->event_closed (endpoint, s);
219 zmq::fd_t zmq::vmci_listener_t::accept ()
225 fd_t sock = ::accept (s, NULL, NULL);
227 #ifdef ZMQ_HAVE_WINDOWS 228 if (sock == INVALID_SOCKET) {
229 wsa_assert(WSAGetLastError() == WSAEWOULDBLOCK ||
230 WSAGetLastError() == WSAECONNRESET ||
231 WSAGetLastError() == WSAEMFILE ||
232 WSAGetLastError() == WSAENOBUFS);
235 #if !defined _WIN32_WCE 237 BOOL brc = SetHandleInformation((HANDLE)sock, HANDLE_FLAG_INHERIT, 0);
244 errno ==
ENOBUFS || errno == ENOMEM || errno == EMFILE ||
253 int rc = fcntl (sock, F_SETFD, FD_CLOEXEC);
static session_base_t * create(zmq::io_thread_t *io_thread_, bool active_, zmq::socket_base_t *socket_, const options_t &options_, address_t *addr_)
void process_term(int linger_)
fd_t open_socket(int domain_, int type_, int protocol_)
ZMQ_EXPORT int zmq_errno(void)