]> git.llucax.com Git - software/posixx.git/blob - src/socket/inet.hpp
Use std namespace for size_t and ptrdiff_t
[software/posixx.git] / src / socket / inet.hpp
1 #ifndef POSIXX_SOCKET_INET_HPP_
2 #define POSIXX_SOCKET_INET_HPP_
3
4 #include "basic_socket.hpp" // posixx::socket
5
6 #include <netinet/in.h> // sockaddr_in, htonl, htons, {PF,AF}_INET, INADDR_ANY
7 #include <arpa/inet.h> // inet_addr
8 #include <cstring> // memset
9 #include <string> // std::string
10
11 /// @file
12
13 namespace posixx { namespace socket {
14
15 /// Internet Protocol sockets
16 namespace inet {
17
18 /// IP socket address
19 struct sockaddr: sockaddr_in
20 {
21
22         /**
23          * Create an IP socket address.
24          */
25         sockaddr(u_int16_t port = 0, const std::string& ip = "0.0.0.0")
26                         throw ();
27
28         /// Length of this IP socket address
29         socklen_t length() const throw ();
30
31         /// Compare two IP socket addresses
32         bool operator == (const sockaddr& other) const throw ();
33
34         /// Get the port number
35         uint16_t port() const throw ();
36
37         /// Get the IP address
38         std::string addr() const throw ();
39
40 }; // struct sockaddr
41
42 /// IP socket traits
43 struct traits
44 {
45         /// Socket address type.
46         typedef inet::sockaddr sockaddr;
47         /// Protocol family.
48         enum { PF = PF_INET };
49 };
50
51 /// IP socket
52 typedef posixx::socket::basic_socket< traits > socket;
53
54 } } } // namespace posixx::socket::inet
55
56
57
58
59 inline
60 posixx::socket::inet::sockaddr::sockaddr(u_int16_t port, const std::string& ip)
61                 throw ()
62 {
63         memset(this, 0, sizeof(struct sockaddr_in));
64         sin_family = AF_INET;
65         if (ip == "0.0.0.0") {
66                 sin_addr.s_addr = htonl(INADDR_ANY);
67         }
68         else {
69                 sin_addr.s_addr = inet_addr(ip.c_str());
70         }
71         sin_port = htons(port);
72 }
73
74 inline
75 socklen_t posixx::socket::inet::sockaddr::length() const throw ()
76 {
77         return sizeof(sockaddr_in);
78 }
79
80 inline
81 bool posixx::socket::inet::sockaddr::operator == (const sockaddr& other) const
82                 throw ()
83 {
84         return !memcmp(this, &other, sizeof(*this));
85 }
86
87 inline
88 uint16_t posixx::socket::inet::sockaddr::port() const throw ()
89 {
90         return ntohs(sin_port);
91 }
92
93 inline
94 std::string posixx::socket::inet::sockaddr::addr() const throw ()
95 {
96         return inet_ntoa(sin_addr);
97 }
98
99 #endif // POSIXX_SOCKET_INET_HPP_