]> git.llucax.com Git - software/posixx.git/blob - src/socket/inet.hpp
Add Boost License
[software/posixx.git] / src / socket / inet.hpp
1 // Copyright Leandro Lucarella 2008 - 2010.
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file COPYING or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5
6
7 #ifndef POSIXX_SOCKET_INET_HPP_
8 #define POSIXX_SOCKET_INET_HPP_
9
10 #include "basic_socket.hpp" // posixx::socket
11
12 #include <netinet/in.h> // sockaddr_in, htonl, htons, {PF,AF}_INET, INADDR_ANY
13 #include <arpa/inet.h> // inet_addr
14 #include <cstring> // memset
15 #include <string> // std::string
16
17 /// @file
18
19 namespace posixx { namespace socket {
20
21 /// Internet Protocol sockets
22 namespace inet {
23
24
25 /// Address to accept any incoming messages
26 const uint32_t any = INADDR_ANY;
27
28 /// Address to send to all hosts
29 const uint32_t broadcast = INADDR_BROADCAST;
30
31
32 /// IP socket address
33 struct sockaddr: sockaddr_in
34 {
35
36         /**
37          * Create an IP socket address.
38          *
39          * @note The IP address is expected in network byte order but the
40          *       port is expected in host byte order. This is because this
41          *       constructor is expected to be used with predefined IP
42          *       addresses, like any, none, loopback, etc.
43          *
44          * @param addr IP address in network byte order
45          * @param port IP port in host byte order
46          *
47          * @see any, none, etc. constants
48          */
49         explicit sockaddr(uint32_t addr = any, uint16_t port = 0) throw ();
50
51         /**
52          * Create an IP socket address.
53          *
54          * @param addr String representation of the IP address
55          * @param port IP port in host byte order
56          */
57         explicit sockaddr(const std::string& addr, uint16_t port) throw ();
58
59         /**
60          * Set the IP address and port.
61          *
62          * @param addr IP address in network byte order
63          * @param port IP port in host byte order
64          *
65          * @see sockaddr(uint32_t, uint16_t)
66          */
67         void set(uint32_t addr, uint16_t port) throw();
68
69         /**
70          * Set the IP address and port.
71          *
72          * @param addr String representation of the IP address
73          * @param port IP port in host byte order
74          *
75          * @see sockaddr(const std::string&, uint16_t)
76          */
77         void set(const std::string& addr, uint16_t port) throw();
78
79         /// Get the IP address as a string
80         std::string addr() const throw ();
81
82         /// Set the IP address (in network byte order)
83         void addr(uint32_t addr) throw ();
84
85         /// Set the IP address from a string
86         void addr(const std::string& addr) throw ();
87
88         /// Get the port number
89         uint16_t port() const throw ();
90
91         /// Set the port number (port is expected to be in host byte order)
92         void port(uint16_t port) throw ();
93
94         /// Length of this IP socket address
95         socklen_t length() const throw ();
96
97         /// Compare two IP socket addresses
98         bool operator == (const sockaddr& other) const throw ();
99
100 }; // struct sockaddr
101
102 /// IP socket traits
103 struct traits
104 {
105         /// Socket address type.
106         typedef inet::sockaddr sockaddr;
107         /// Protocol family.
108         enum { PF = PF_INET };
109 };
110
111 /// IP socket
112 typedef posixx::socket::basic_socket< traits > socket;
113
114 } } } // namespace posixx::socket::inet
115
116
117
118
119 inline
120 posixx::socket::inet::sockaddr::sockaddr(uint32_t addr, uint16_t port)
121                 throw ()
122 {
123         memset(this, 0, sizeof(struct sockaddr_in));
124         sin_family = AF_INET;
125         set(addr, port);
126 }
127
128 inline
129 posixx::socket::inet::sockaddr::sockaddr(const std::string& addr, uint16_t port)
130                 throw ()
131 {
132         memset(this, 0, sizeof(struct sockaddr_in));
133         sin_family = AF_INET;
134         set(addr, port);
135 }
136
137 inline
138 void posixx::socket::inet::sockaddr::set(uint32_t addr, uint16_t port)
139                 throw ()
140 {
141         sin_addr.s_addr = addr;
142         this->port(port);
143 }
144
145 inline
146 void posixx::socket::inet::sockaddr::set(const std::string& addr, uint16_t port)
147                 throw ()
148 {
149         this->addr(addr);
150         this->port(port);
151 }
152
153 inline
154 std::string posixx::socket::inet::sockaddr::addr() const throw ()
155 {
156         return inet_ntoa(sin_addr);
157 }
158
159 inline
160 void posixx::socket::inet::sockaddr::addr(uint32_t addr) throw ()
161 {
162         sin_addr.s_addr = addr;
163 }
164
165 inline
166 void posixx::socket::inet::sockaddr::addr(const std::string& addr) throw ()
167 {
168         sin_addr.s_addr = inet_addr(addr.c_str());
169 }
170
171 inline
172 uint16_t posixx::socket::inet::sockaddr::port() const throw ()
173 {
174         return ntohs(sin_port);
175 }
176
177 inline
178 void posixx::socket::inet::sockaddr::port(uint16_t port) throw ()
179 {
180         sin_port = htons(port);
181 }
182
183 inline
184 socklen_t posixx::socket::inet::sockaddr::length() const throw ()
185 {
186         return sizeof(sockaddr_in);
187 }
188
189 inline
190 bool posixx::socket::inet::sockaddr::operator == (const sockaddr& other) const
191                 throw ()
192 {
193         return !memcmp(this, &other, sizeof(*this));
194 }
195
196 #endif // POSIXX_SOCKET_INET_HPP_