0
0
mirror of https://github.com/zeromq/libzmq.git synced 2024-12-28 07:58:14 +08:00

Problem: get_socket_address and get_socket_name not available throughout libzmq and restricted to local address

Solution: move to address.hpp/.cpp and generalize
This commit is contained in:
Simon Giesecke 2019-02-01 10:47:31 -05:00 committed by Simon Giesecke
parent 01371398e9
commit aec9b130f7
13 changed files with 90 additions and 67 deletions

View File

@ -108,3 +108,17 @@ int zmq::address_t::to_string (std::string &addr_) const
addr_.clear ();
return -1;
}
zmq::zmq_socklen_t zmq::get_socket_address (fd_t fd_,
socket_end_t socket_end_,
sockaddr_storage *ss_)
{
zmq_socklen_t sl = static_cast<zmq_socklen_t> (sizeof (*ss_));
const int rc =
socket_end_ == socket_end_local
? getsockname (fd_, reinterpret_cast<struct sockaddr *> (ss_), &sl)
: getpeername (fd_, reinterpret_cast<struct sockaddr *> (ss_), &sl);
return rc != 0 ? 0 : sl;
}

View File

@ -30,8 +30,16 @@
#ifndef __ZMQ_ADDRESS_HPP_INCLUDED__
#define __ZMQ_ADDRESS_HPP_INCLUDED__
#include "fd.hpp"
#include <string>
#ifndef ZMQ_HAVE_WINDOWS
#include <sys/socket.h>
#else
#include <ws2tcpip.h>
#endif
namespace zmq
{
class ctx_t;
@ -97,6 +105,37 @@ struct address_t
int to_string (std::string &addr_) const;
};
#if defined(ZMQ_HAVE_HPUX) || defined(ZMQ_HAVE_VXWORKS) \
|| defined(ZMQ_HAVE_WINDOWS)
typedef int zmq_socklen_t;
#else
typedef socklen_t zmq_socklen_t;
#endif
enum socket_end_t
{
socket_end_local,
socket_end_remote
};
zmq_socklen_t
get_socket_address (fd_t fd_, socket_end_t socket_end_, sockaddr_storage *ss_);
template <typename T>
std::string get_socket_name (fd_t fd_, socket_end_t socket_end_)
{
struct sockaddr_storage ss;
const zmq_socklen_t sl = get_socket_address (fd_, socket_end_, &ss);
if (sl == 0) {
return std::string ();
}
const T addr (reinterpret_cast<struct sockaddr *> (&ss), sl);
std::string address_string;
addr.to_string (address_string);
return address_string;
}
}
#endif

View File

@ -43,6 +43,7 @@
#include "err.hpp"
#include "ip.hpp"
#include "socket_base.hpp"
#include "address.hpp"
#include <unistd.h>
#include <sys/socket.h>
@ -151,12 +152,12 @@ void zmq::ipc_listener_t::in_event ()
create_engine (fd);
}
std::string zmq::ipc_listener_t::get_socket_name (zmq::fd_t fd_) const
std::string zmq::ipc_listener_t::get_local_socket_name (zmq::fd_t fd_) const
{
return stream_listener_base_t::get_socket_name<ipc_address_t> (fd_);
return zmq::get_socket_name<ipc_address_t> (fd_, socket_end_local);
}
int zmq::ipc_listener_t::set_address (const char *addr_)
int zmq::ipc_listener_t::set_local_address (const char *addr_)
{
// Create addr on stack for auto-cleanup
std::string addr (addr_);

View File

@ -48,10 +48,10 @@ class ipc_listener_t : public stream_listener_base_t
const options_t &options_);
// Set address to listen on.
int set_address (const char *addr_);
int set_local_address (const char *addr_);
protected:
std::string get_socket_name (fd_t fd_) const;
std::string get_local_socket_name (fd_t fd_) const;
private:
// Handlers for I/O events.

View File

@ -612,7 +612,7 @@ int zmq::socket_base_t::bind (const char *endpoint_uri_)
tcp_listener_t *listener =
new (std::nothrow) tcp_listener_t (io_thread, this, options);
alloc_assert (listener);
rc = listener->set_address (address.c_str ());
rc = listener->set_local_address (address.c_str ());
if (rc != 0) {
LIBZMQ_DELETE (listener);
event_bind_failed (make_unconnected_bind_endpoint_pair (address),
@ -621,7 +621,7 @@ int zmq::socket_base_t::bind (const char *endpoint_uri_)
}
// Save last endpoint URI
listener->get_address (_last_endpoint);
listener->get_local_address (_last_endpoint);
add_endpoint (make_unconnected_bind_endpoint_pair (_last_endpoint),
static_cast<own_t *> (listener), NULL);
@ -635,7 +635,7 @@ int zmq::socket_base_t::bind (const char *endpoint_uri_)
ipc_listener_t *listener =
new (std::nothrow) ipc_listener_t (io_thread, this, options);
alloc_assert (listener);
int rc = listener->set_address (address.c_str ());
int rc = listener->set_local_address (address.c_str ());
if (rc != 0) {
LIBZMQ_DELETE (listener);
event_bind_failed (make_unconnected_bind_endpoint_pair (address),
@ -644,7 +644,7 @@ int zmq::socket_base_t::bind (const char *endpoint_uri_)
}
// Save last endpoint URI
listener->get_address (_last_endpoint);
listener->get_local_address (_last_endpoint);
add_endpoint (make_unconnected_bind_endpoint_pair (_last_endpoint),
static_cast<own_t *> (listener), NULL);
@ -657,7 +657,7 @@ int zmq::socket_base_t::bind (const char *endpoint_uri_)
tipc_listener_t *listener =
new (std::nothrow) tipc_listener_t (io_thread, this, options);
alloc_assert (listener);
int rc = listener->set_address (address.c_str ());
int rc = listener->set_local_address (address.c_str ());
if (rc != 0) {
LIBZMQ_DELETE (listener);
event_bind_failed (make_unconnected_bind_endpoint_pair (address),
@ -666,7 +666,7 @@ int zmq::socket_base_t::bind (const char *endpoint_uri_)
}
// Save last endpoint URI
listener->get_address (_last_endpoint);
listener->get_local_address (_last_endpoint);
// TODO shouldn't this use _last_endpoint as in the other cases?
add_endpoint (make_unconnected_bind_endpoint_pair (endpoint_uri_),
@ -680,14 +680,14 @@ int zmq::socket_base_t::bind (const char *endpoint_uri_)
vmci_listener_t *listener =
new (std::nothrow) vmci_listener_t (io_thread, this, options);
alloc_assert (listener);
int rc = listener->set_address (address.c_str ());
int rc = listener->set_local_address (address.c_str ());
if (rc != 0) {
LIBZMQ_DELETE (listener);
event_bind_failed (address, zmq_errno ());
return -1;
}
listener->get_address (_last_endpoint);
listener->get_local_address (_last_endpoint);
add_endpoint (_last_endpoint.c_str (), static_cast<own_t *> (listener),
NULL);

View File

@ -51,24 +51,12 @@ zmq::stream_listener_base_t::~stream_listener_base_t ()
zmq_assert (!_handle);
}
int zmq::stream_listener_base_t::get_address (std::string &addr_) const
int zmq::stream_listener_base_t::get_local_address (std::string &addr_) const
{
addr_ = get_socket_name (_s);
addr_ = get_local_socket_name (_s);
return addr_.empty () ? -1 : 0;
}
zmq::zmq_socklen_t
zmq::stream_listener_base_t::get_socket_address (fd_t fd_,
sockaddr_storage *ss_)
{
zmq_socklen_t sl = static_cast<zmq_socklen_t> (sizeof (*ss_));
const int rc =
getsockname (fd_, reinterpret_cast<struct sockaddr *> (ss_), &sl);
return rc != 0 ? 0 : sl;
}
void zmq::stream_listener_base_t::process_plug ()
{
// Start polling for incoming connections.
@ -104,8 +92,8 @@ int zmq::stream_listener_base_t::close ()
void zmq::stream_listener_base_t::create_engine (fd_t fd)
{
const endpoint_uri_pair_t endpoint_pair (_endpoint, get_socket_name (fd),
endpoint_type_bind);
const endpoint_uri_pair_t endpoint_pair (
_endpoint, get_local_socket_name (fd), endpoint_type_bind);
stream_engine_t *engine =
new (std::nothrow) stream_engine_t (fd, options, endpoint_pair);

View File

@ -43,12 +43,6 @@ namespace zmq
class io_thread_t;
class socket_base_t;
#if defined(ZMQ_HAVE_HPUX) || defined(ZMQ_HAVE_VXWORKS)
typedef int zmq_socklen_t;
#else
typedef socklen_t zmq_socklen_t;
#endif
class stream_listener_base_t : public own_t, public io_object_t
{
public:
@ -58,25 +52,10 @@ class stream_listener_base_t : public own_t, public io_object_t
~stream_listener_base_t ();
// Get the bound address for use with wildcards
int get_address (std::string &addr_) const;
int get_local_address (std::string &addr_) const;
protected:
static zmq_socklen_t get_socket_address (fd_t fd_, sockaddr_storage *ss_);
virtual std::string get_socket_name (fd_t fd_) const = 0;
template <typename T> static std::string get_socket_name (fd_t fd_)
{
struct sockaddr_storage ss;
const zmq_socklen_t sl = get_socket_address (fd_, &ss);
if (sl == 0) {
return std::string ();
}
const T addr (reinterpret_cast<struct sockaddr *> (&ss), sl);
std::string address_string;
addr.to_string (address_string);
return address_string;
}
virtual std::string get_local_socket_name (fd_t fd_) const = 0;
private:
// Handlers for incoming commands.

View File

@ -40,6 +40,7 @@
#include "ip.hpp"
#include "tcp.hpp"
#include "socket_base.hpp"
#include "address.hpp"
#ifndef ZMQ_HAVE_WINDOWS
#include <unistd.h>
@ -93,12 +94,12 @@ void zmq::tcp_listener_t::in_event ()
create_engine (fd);
}
std::string zmq::tcp_listener_t::get_socket_name (zmq::fd_t fd_) const
std::string zmq::tcp_listener_t::get_local_socket_name (zmq::fd_t fd_) const
{
return stream_listener_base_t::get_socket_name<tcp_address_t> (fd_);
return zmq::get_socket_name<tcp_address_t> (fd_, socket_end_local);
}
int zmq::tcp_listener_t::set_address (const char *addr_)
int zmq::tcp_listener_t::set_local_address (const char *addr_)
{
// Convert the textual address into address structure.
int rc = _address.resolve (addr_, true, options.ipv6);

View File

@ -44,10 +44,10 @@ class tcp_listener_t : public stream_listener_base_t
const options_t &options_);
// Set address to listen on.
int set_address (const char *addr_);
int set_local_address (const char *addr_);
protected:
std::string get_socket_name (fd_t fd_) const;
std::string get_local_socket_name (fd_t fd_) const;
private:
// Handlers for I/O events.

View File

@ -43,6 +43,7 @@
#include "err.hpp"
#include "ip.hpp"
#include "socket_base.hpp"
#include "address.hpp"
#include <unistd.h>
#include <sys/socket.h>
@ -77,12 +78,12 @@ void zmq::tipc_listener_t::in_event ()
create_engine (fd);
}
std::string zmq::tipc_listener_t::get_socket_name (zmq::fd_t fd_) const
std::string zmq::tipc_listener_t::get_local_socket_name (zmq::fd_t fd_) const
{
return stream_listener_base_t::get_socket_name<tipc_address_t> (fd_);
return zmq::get_socket_name<tipc_address_t> (fd_, socket_end_local);
}
int zmq::tipc_listener_t::set_address (const char *addr_)
int zmq::tipc_listener_t::set_local_address (const char *addr_)
{
// Convert str to address struct
int rc = _address.resolve (addr_);
@ -104,7 +105,7 @@ int zmq::tipc_listener_t::set_address (const char *addr_)
// If random Port Identity, update address object to reflect the assigned address
if (_address.is_random ()) {
struct sockaddr_storage ss;
const zmq_socklen_t sl = get_socket_address (_s, &ss);
const zmq_socklen_t sl = get_socket_address (_s, socket_end_local, &ss);
if (sl == 0)
goto error;

View File

@ -50,10 +50,10 @@ class tipc_listener_t : public stream_listener_base_t
const options_t &options_);
// Set address to listen on.
int set_address (const char *addr_);
int set_local_address (const char *addr_);
protected:
std::string get_socket_name (fd_t fd_) const;
std::string get_local_socket_name (fd_t fd_) const;
private:
// Handlers for I/O events.

View File

@ -125,7 +125,7 @@ void zmq::vmci_listener_t::in_event ()
socket->event_accepted (endpoint, fd);
}
int zmq::vmci_listener_t::get_address (std::string &addr_)
int zmq::vmci_listener_t::get_local_address (std::string &addr_)
{
struct sockaddr_storage ss;
#ifdef ZMQ_HAVE_HPUX
@ -143,7 +143,7 @@ int zmq::vmci_listener_t::get_address (std::string &addr_)
return addr.to_string (addr_);
}
int zmq::vmci_listener_t::set_address (const char *addr_)
int zmq::vmci_listener_t::set_local_address (const char *addr_)
{
// Create addr on stack for auto-cleanup
std::string addr (addr_);

View File

@ -56,10 +56,10 @@ class vmci_listener_t : public own_t, public io_object_t
~vmci_listener_t ();
// Set address to listen on.
int set_address (const char *addr_);
int set_local_address (const char *addr_);
// Get the bound address for use with wildcards
int get_address (std::string &addr_);
int get_local_address (std::string &addr_);
private:
// Handlers for incoming commands.