Commit b0573486 authored by Mikko Koppanen's avatar Mikko Koppanen

Fixes for tcp_listener::get_address

parent 06140daf
...@@ -122,36 +122,30 @@ void zmq::tcp_listener_t::close () ...@@ -122,36 +122,30 @@ void zmq::tcp_listener_t::close ()
int zmq::tcp_listener_t::get_address (std::string *addr_) int zmq::tcp_listener_t::get_address (std::string *addr_)
{ {
struct sockaddr sa; struct sockaddr_storage ss;
char host[INET6_ADDRSTRLEN]; char host [NI_MAXHOST];
char serv_info[32]; char serv_info [NI_MAXSERV];
int port, rc; int port, rc;
std::stringstream portnum; std::stringstream address;
// Get the details of the TCP socket // Get the details of the TCP socket
socklen_t sl = sizeof(sockaddr); socklen_t sl = sizeof (ss);
rc = getsockname (s, &sa, &sl); rc = getsockname (s, (struct sockaddr *) &ss, &sl);
if (rc != 0) { if (rc != 0) {
return rc; return rc;
} }
// Split the retrieval between IPv4 and v6 addresses rc = getnameinfo ((struct sockaddr *) &ss, ss.ss_len, host, NI_MAXHOST, serv_info, NI_MAXSERV, NI_NUMERICHOST);
if ( sa.sa_family == AF_INET ) { if (rc != 0) {
getnameinfo(&sa, sizeof(struct sockaddr), host, INET6_ADDRSTRLEN, serv_info, 32, NI_NUMERICHOST); return rc;
port = ntohs( ((struct sockaddr_in *)&sa)->sin_port); }
portnum << port;
if (ss.ss_family == AF_INET) {
// Store the address for retrieval by users using wildcards address << "tcp://" << host << ":" << port;
*addr_ = std::string("tcp://") + std::string(host) + std::string(":") + portnum.str();
} else { } else {
getnameinfo(&sa, sizeof(struct sockaddr), host, INET6_ADDRSTRLEN, serv_info, 32, NI_NUMERICHOST); address << "tcp://[" << host << "]:" << port;
port = ntohs( ((struct sockaddr_in6 *)&sa)->sin6_port);
portnum << port;
// Store the address for retrieval by users using wildcards
*addr_ = std::string("tcp://[") + std::string(host) + std::string("]:") + portnum.str();
} }
*addr_ = address.str ();
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment