1 // Extends ACE_INET_Addr with support for multi-homed addresses.
3 #include "ace/Multihomed_INET_Addr.h"
4 #include "ace/Log_Category.h"
6 #if !defined (__ACE_INLINE__)
7 # include "ace/Multihomed_INET_Addr.inl"
8 #endif /* __ACE_INLINE__ */
10 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
12 ACE_ALLOC_HOOK_DEFINE(ACE_Multihomed_INET_Addr
)
14 // Default constructor
16 ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr (void)
19 ACE_TRACE ("ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr");
22 ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr (const char address
[])
23 : ACE_INET_Addr (address
),
28 ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr(u_short port_number
,
29 const char host_name
[],
32 const char *(secondary_host_names
[]),
35 // Initialize the primary INET addr
36 ACE_INET_Addr::set(port_number
, host_name
, encode
, address_family
);
38 // check for secondary INET addrs
39 if (secondary_host_names
&& size
){
40 // we have a non-zero pointer and size
41 this->secondaries_
.size(size
); // size the array
43 size_t next_empty_slot
= 0;
44 for (size_t i
= 0; i
< size
; ++i
) {
45 int ret
= this->secondaries_
[next_empty_slot
].set(port_number
,
46 secondary_host_names
[i
],
50 ACELIB_DEBUG ((LM_DEBUG
,
51 ACE_TEXT ("Invalid INET addr (%C:%u) will be ignored\n"),
52 secondary_host_names
[i
], port_number
));
53 this->secondaries_
.size(this->secondaries_
.size() - 1);
63 #if defined (ACE_HAS_WCHAR)
64 ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr(u_short port_number
,
65 const wchar_t host_name
[],
68 const wchar_t *(secondary_host_names
[]),
71 // Initialize the primary INET addr
72 ACE_INET_Addr::set(port_number
, host_name
, encode
, address_family
);
74 // check for secondary INET addrs
75 if (secondary_host_names
&& size
){
76 // we have a non-zero pointer and size
77 this->secondaries_
.size(size
); // size the array
79 size_t next_empty_slot
= 0;
80 for (size_t i
= 0; i
< size
; ++i
) {
81 int ret
= this->secondaries_
[next_empty_slot
].set(port_number
,
82 secondary_host_names
[i
],
86 ACELIB_DEBUG ((LM_DEBUG
,
87 ACE_TEXT ("Invalid INET addr (%s:%u) will be ignored\n"),
88 ACE_TEXT_WCHAR_TO_TCHAR (secondary_host_names
[i
]), port_number
));
89 this->secondaries_
.size(this->secondaries_
.size() - 1);
98 #endif /* ACE_HAS_WCHAR */
100 ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr(u_short port_number
,
101 ACE_UINT32 primary_ip_addr
,
103 const ACE_UINT32
*secondary_ip_addrs
,
106 // Initialize the primary INET addr
107 ACE_INET_Addr::set(port_number
, primary_ip_addr
, encode
);
109 // check for secondary INET addrs
110 if (secondary_ip_addrs
&& size
){
111 // we have a non-zero pointer and size
112 this->secondaries_
.size(size
); // size the array
114 size_t next_empty_slot
= 0;
115 for (size_t i
= 0; i
< size
; ++i
) {
116 int const ret
= this->secondaries_
[next_empty_slot
].set(port_number
,
117 secondary_ip_addrs
[i
],
121 ACELIB_DEBUG ((LM_DEBUG
,
122 "Invalid INET addr (%u:%u) will be ignored\n",
123 secondary_ip_addrs
[i
], port_number
));
124 this->secondaries_
.size(this->secondaries_
.size() - 1);
134 // Set implementations (NEED BETTER COMMENT HERE)
136 ACE_Multihomed_INET_Addr::set (u_short port_number
,
137 const char host_name
[],
140 const char *(secondary_host_names
[]),
143 this->secondaries_
.size(size
);
145 for (size_t i
= 0; i
< size
; ++i
) {
147 int const ret
= this->secondaries_
[i
].set(port_number
,
148 secondary_host_names
[i
],
156 return ACE_INET_Addr::set(port_number
, host_name
, encode
, address_family
);
159 #if defined (ACE_HAS_WCHAR)
161 // WCHAR version of ::set
164 ACE_Multihomed_INET_Addr::set (u_short port_number
,
165 const wchar_t host_name
[],
168 const wchar_t *(secondary_host_names
[]),
171 this->secondaries_
.size(size
);
173 for (size_t i
= 0; i
< size
; ++i
) {
175 int ret
= this->secondaries_
[i
].set(port_number
,
176 secondary_host_names
[i
],
184 return ACE_INET_Addr::set(port_number
, host_name
, encode
, address_family
);
186 #endif /* ACE_HAS_WCHAR */
189 ACE_Multihomed_INET_Addr::set (u_short port_number
,
190 ACE_UINT32 primary_ip_addr
,
192 const ACE_UINT32
*secondary_ip_addrs
,
195 this->secondaries_
.size(size
);
197 for (size_t i
= 0; i
< size
; ++i
) {
199 int ret
= this->secondaries_
[i
].set(port_number
,
200 secondary_ip_addrs
[i
],
208 return ACE_INET_Addr::set(port_number
, primary_ip_addr
, encode
);
212 ACE_Multihomed_INET_Addr::set_port_number (u_short port_number
, int encode
)
215 while (i
< secondaries_
.size())
216 secondaries_
[i
++].set_port_number(port_number
, encode
);
218 this->ACE_INET_Addr::set_port_number(port_number
, encode
);
222 ACE_Multihomed_INET_Addr::get_secondary_addresses(ACE_INET_Addr
*secondary_addrs
,
226 size
< this->secondaries_
.size() ?
227 size
: this->secondaries_
.size();
229 for (size_t i
= 0; i
< top
; ++i
)
233 secondary_addrs
[i
].set (this->secondaries_
[i
]);
243 ACE_Multihomed_INET_Addr::get_addresses(sockaddr_in
*addrs
,
248 // Copy primary address(es) to the first slot(s) of the user-supplied array
249 ACE_INET_Addr
me (*this);
251 for (i
= 0; i
< size
; ++i
)
253 sockaddr_in
*in4
= reinterpret_cast<sockaddr_in
*> (me
.get_addr ());
254 if (in4
->sin_family
== AF_INET
)
263 // Copy secondary addresses to remaining slots of the user-supplied
264 // array. Secondary address [i] is copied to slot [i+1]
265 for (size_t j
= 0; j
< this->secondaries_
.size (); ++j
)
267 ACE_INET_Addr
copy (this->secondaries_
[j
]);
268 for (; i
< size
; ++i
)
270 sockaddr_in
*in4
= reinterpret_cast<sockaddr_in
*> (copy
.get_addr ());
271 if (in4
->sin_family
== AF_INET
)
282 #if defined (ACE_HAS_IPV6)
284 ACE_Multihomed_INET_Addr::get_addresses(sockaddr_in6
*addrs
,
289 // Copy primary address(es) to the first slot(s) of the user-supplied array
290 ACE_INET_Addr
me (*this);
292 for (i
= 0; i
< size
; ++i
)
294 sockaddr_in6
*in6
= reinterpret_cast<sockaddr_in6
*> (me
.get_addr ());
295 if (in6
->sin6_family
== AF_INET6
)
304 // Copy secondary addresses to remaining slots of the user-supplied
305 // array. Secondary address [i] is copied to slot [i+1]
306 for (size_t j
= 0; j
< this->secondaries_
.size (); ++j
)
308 ACE_INET_Addr
copy (this->secondaries_
[j
]);
309 for (; i
< size
; ++i
)
312 reinterpret_cast<sockaddr_in6
*> (copy
.get_addr ());
313 if (in6
->sin6_family
== AF_INET6
)
323 #endif /* ACE_HAS_IPV6 */
326 ACE_Multihomed_INET_Addr::~ACE_Multihomed_INET_Addr (void)
331 ACE_END_VERSIONED_NAMESPACE_DECL