Line data Source code
1 : /*
2 : Copyright (c) 2007-2016 Contributors as noted in the AUTHORS file
3 :
4 : This file is part of libzmq, the ZeroMQ core engine in C++.
5 :
6 : libzmq is free software; you can redistribute it and/or modify it under
7 : the terms of the GNU Lesser General Public License (LGPL) as published
8 : by the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : As a special exception, the Contributors give you permission to link
12 : this library with independent modules to produce an executable,
13 : regardless of the license terms of these independent modules, and to
14 : copy and distribute the resulting executable under terms of your choice,
15 : provided that you also meet, for each linked independent module, the
16 : terms and conditions of the license of that module. An independent
17 : module is a module which is not derived from or based on this library.
18 : If you modify this library, you must extend this exception to your
19 : version of the library.
20 :
21 : libzmq is distributed in the hope that it will be useful, but WITHOUT
22 : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
23 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
24 : License for more details.
25 :
26 : You should have received a copy of the GNU Lesser General Public License
27 : along with this program. If not, see <http://www.gnu.org/licenses/>.
28 : */
29 :
30 : #ifndef __ZMQ_TCP_ADDRESS_HPP_INCLUDED__
31 : #define __ZMQ_TCP_ADDRESS_HPP_INCLUDED__
32 :
33 : #include "platform.hpp"
34 :
35 : #if defined ZMQ_HAVE_WINDOWS
36 : #include "windows.hpp"
37 : #else
38 : #include <sys/socket.h>
39 : #include <netinet/in.h>
40 : #endif
41 :
42 : namespace zmq
43 : {
44 :
45 0 : class tcp_address_t
46 : {
47 : public:
48 :
49 : tcp_address_t ();
50 : tcp_address_t (const sockaddr *sa, socklen_t sa_len);
51 : virtual ~tcp_address_t ();
52 :
53 : // This function translates textual TCP address into an address
54 : // structure. If 'local' is true, names are resolved as local interface
55 : // names. If it is false, names are resolved as remote hostnames.
56 : // If 'ipv6' is true, the name may resolve to IPv6 address.
57 : int resolve (const char *name_, bool local_, bool ipv6_, bool is_src_ = false);
58 :
59 : // The opposite to resolve()
60 : virtual int to_string (std::string &addr_);
61 :
62 : #if defined ZMQ_HAVE_WINDOWS
63 : unsigned short family () const;
64 : #else
65 : sa_family_t family () const;
66 : #endif
67 : const sockaddr *addr () const;
68 : socklen_t addrlen () const;
69 :
70 : const sockaddr *src_addr () const;
71 : socklen_t src_addrlen () const;
72 : bool has_src_addr () const;
73 :
74 : protected:
75 : int resolve_nic_name (const char *nic_, bool ipv6_, bool is_src_ = false);
76 : int resolve_interface (const char *interface_, bool ipv6_, bool is_src_ = false);
77 : int resolve_hostname (const char *hostname_, bool ipv6_, bool is_src_ = false);
78 :
79 : union {
80 : sockaddr generic;
81 : sockaddr_in ipv4;
82 : sockaddr_in6 ipv6;
83 : } address;
84 :
85 : union {
86 : sockaddr generic;
87 : sockaddr_in ipv4;
88 : sockaddr_in6 ipv6;
89 : } source_address;
90 : bool _has_src_addr;
91 : };
92 :
93 0 : class tcp_address_mask_t : public tcp_address_t
94 : {
95 : public:
96 : tcp_address_mask_t ();
97 :
98 : // This function enhances tcp_address_t::resolve() with ability to parse
99 : // additional cidr-like(/xx) mask value at the end of the name string.
100 : // Works only with remote hostnames.
101 : int resolve (const char *name_, bool ipv6_);
102 :
103 : // The opposite to resolve()
104 : int to_string (std::string &addr_);
105 :
106 : int mask () const;
107 :
108 : bool match_address (const struct sockaddr *ss, const socklen_t ss_len) const;
109 :
110 : private:
111 : int address_mask;
112 : };
113 :
114 : }
115 :
116 : #endif
|