GCS  0.2.3
gu_resolver.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2008-2012 Codership Oy <info@codership.com>
3  *
4  * $Id$
5  */
6 
11 #ifndef __GU_RESOLVER_HPP__
12 #define __GU_RESOLVER_HPP__
13 
14 #include "gu_throw.hpp"
15 
16 #include <netdb.h>
17 #include <sys/socket.h>
18 #include <netinet/in.h>
19 
20 #include <string>
21 
22 
23 // Forward declarations
24 namespace gu
25 {
26  class URI;
27 } // namespace gu
28 
29 // Declarations
30 namespace gu
31 {
32  namespace net
33  {
42  class Sockaddr;
43 
49  class MReq;
50 
59  class Addrinfo;
60 
68  Addrinfo resolve(const gu::URI& uri);
69  } // namespace net
70 } // namespace gu
71 
72 
74 {
75 public:
82  Sockaddr(const sockaddr* sa, socklen_t sa_len);
83 
89  Sockaddr(const Sockaddr& sa);
90 
94  ~Sockaddr();
95 
101  sa_family_t get_family() const { return sa_->sa_family; }
102 
109  unsigned short get_port() const
110  {
111  switch(sa_->sa_family)
112  {
113  case AF_INET:
114  return reinterpret_cast<const sockaddr_in*>(sa_)->sin_port;
115  case AF_INET6:
116  return reinterpret_cast<const sockaddr_in6*>(sa_)->sin6_port;
117  default:
118  gu_throw_fatal;
119  }
120  }
121 
130  const void* get_addr() const
131  {
132  switch(sa_->sa_family)
133  {
134  case AF_INET:
135  return &reinterpret_cast<const sockaddr_in*>(sa_)->sin_addr;
136  case AF_INET6:
137  return &reinterpret_cast<const sockaddr_in6*>(sa_)->sin6_addr;
138  default:
139  gu_throw_fatal << "invalid address family: " << sa_->sa_family;
140  }
141  }
142 
143  socklen_t get_addr_len() const
144  {
145  switch(sa_->sa_family)
146  {
147  case AF_INET:
148  return sizeof(reinterpret_cast<const sockaddr_in*>(sa_)->sin_addr);
149  case AF_INET6:
150  return sizeof(reinterpret_cast<const sockaddr_in6*>(sa_)->sin6_addr);
151  default:
152  gu_throw_fatal;
153  }
154  }
155 
161  sockaddr& get_sockaddr() { return *sa_; }
162 
168  const sockaddr& get_sockaddr() const { return *sa_; }
169 
175  socklen_t get_sockaddr_len() const { return sa_len_; }
176 
177  bool is_multicast() const;
178  bool is_broadcast() const;
179  bool is_anyaddr() const;
180 
181  static Sockaddr get_anyaddr(const Sockaddr& sa)
182  {
183  Sockaddr ret(sa);
184  switch(ret.sa_->sa_family)
185  {
186  case AF_INET:
187  reinterpret_cast<sockaddr_in*>(ret.sa_)->sin_addr.s_addr = 0;
188  break;
189  case AF_INET6:
190  memset(&reinterpret_cast<sockaddr_in6*>(ret.sa_)->sin6_addr,
191  0, sizeof(struct in6_addr));
192  break;
193  default:
194  gu_throw_fatal << "invalid address family: " << ret.sa_->sa_family;
195  }
196  return ret;
197  }
198 
199  Sockaddr& operator=(const Sockaddr& sa)
200  {
201  memcpy(sa_, sa.sa_, sa_len_);
202  return *this;
203  }
204 
205 private:
206 
207  sockaddr* sa_;
208  socklen_t sa_len_;
209 };
210 
211 
213 {
214 public:
215 
216  MReq(const Sockaddr& mcast_addr, const Sockaddr& if_addr);
217  ~MReq();
218 
219  const void* get_mreq() const { return mreq_; }
220  socklen_t get_mreq_len() const { return mreq_len_; }
221  int get_ipproto() const { return ipproto_; }
222  int get_add_membership_opt() const { return add_membership_opt_; }
223  int get_drop_membership_opt() const { return drop_membership_opt_; }
224  int get_multicast_if_opt() const { return multicast_if_opt_; }
225  int get_multicast_loop_opt() const { return multicast_loop_opt_; }
226  int get_multicast_ttl_opt() const { return multicast_ttl_opt_; }
227  const void* get_multicast_if_value() const;
228  int get_multicast_if_value_size() const;
229 
230 private:
231 
232  MReq(const MReq&);
233  void operator=(const MReq&);
234 
235  void* mreq_;
236  socklen_t mreq_len_;
237  int ipproto_;
238  int add_membership_opt_;
239  int drop_membership_opt_;
240  int multicast_if_opt_;
241  int multicast_loop_opt_;
242  int multicast_ttl_opt_;
243 };
244 
245 
247 {
248 public:
254  Addrinfo(const addrinfo& ai);
255 
261  Addrinfo(const Addrinfo& ai);
262 
270  Addrinfo(const Addrinfo& ai, const Sockaddr& sa);
271 
275  ~Addrinfo();
276 
282  int get_family() const { return ai_.ai_family; }
283 
289  int get_socktype() const { return ai_.ai_socktype; }
290 
296  int get_protocol() const { return ai_.ai_protocol; }
297 
303  socklen_t get_addrlen() const { return ai_.ai_addrlen; }
304 
312  { return Sockaddr(ai_.ai_addr, ai_.ai_addrlen); }
313 
319  std::string to_string() const;
320 
321 private:
322 
323  addrinfo ai_;
324 };
325 
326 
327 #endif /* __GU_RESOLVER_HPP__ */
int get_protocol() const
Definition: gu_resolver.hpp:296
Utility class to parse URIs.
Definition: gu_uri.hpp:41
Class encapsulating struct sockaddr.
Definition: gu_resolver.hpp:73
int get_socktype() const
Definition: gu_resolver.hpp:289
socklen_t get_sockaddr_len() const
Definition: gu_resolver.hpp:175
const sockaddr & get_sockaddr() const
Definition: gu_resolver.hpp:168
sa_family_t get_family() const
Definition: gu_resolver.hpp:101
sockaddr & get_sockaddr()
Definition: gu_resolver.hpp:161
const void * get_addr() const
Definition: gu_resolver.hpp:130
Sockaddr get_addr() const
Definition: gu_resolver.hpp:311
unsigned short get_port() const
Definition: gu_resolver.hpp:109
std::string to_string() const
Addrinfo(const addrinfo &ai)
socklen_t get_addrlen() const
Definition: gu_resolver.hpp:303
int get_family() const
Definition: gu_resolver.hpp:282
Sockaddr(const sockaddr *sa, socklen_t sa_len)
Class encapsulating struct addrinfo.
Definition: gu_resolver.hpp:246
Definition: gu_resolver.hpp:212