OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/base/ip_endpoint.h" | 5 #include "net/base/ip_endpoint.h" |
6 | 6 |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 | 8 |
9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
10 #include <winsock2.h> | 10 #include <winsock2.h> |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 | 82 |
83 IPEndPoint::IPEndPoint() : port_(0) {} | 83 IPEndPoint::IPEndPoint() : port_(0) {} |
84 | 84 |
85 IPEndPoint::~IPEndPoint() {} | 85 IPEndPoint::~IPEndPoint() {} |
86 | 86 |
87 IPEndPoint::IPEndPoint(const IPAddressNumber& address, uint16_t port) | 87 IPEndPoint::IPEndPoint(const IPAddressNumber& address, uint16_t port) |
88 : address_(address), port_(port) { | 88 : address_(address), port_(port) { |
89 } | 89 } |
90 | 90 |
91 IPEndPoint::IPEndPoint(const IPAddress& address, uint16_t port) | 91 IPEndPoint::IPEndPoint(const IPAddress& address, uint16_t port) |
92 : address_(address.bytes()), port_(port) { | 92 : address_(address), port_(port) {} |
93 } | |
94 | 93 |
95 IPEndPoint::IPEndPoint(const IPEndPoint& endpoint) { | 94 IPEndPoint::IPEndPoint(const IPEndPoint& endpoint) { |
96 address_ = endpoint.address_; | 95 address_ = endpoint.address_; |
97 port_ = endpoint.port_; | 96 port_ = endpoint.port_; |
98 } | 97 } |
99 | 98 |
100 AddressFamily IPEndPoint::GetFamily() const { | 99 AddressFamily IPEndPoint::GetFamily() const { |
101 return GetAddressFamily(address_); | 100 return GetAddressFamily(address_.bytes()); |
102 } | 101 } |
103 | 102 |
104 int IPEndPoint::GetSockAddrFamily() const { | 103 int IPEndPoint::GetSockAddrFamily() const { |
105 switch (address_.size()) { | 104 switch (address_.size()) { |
106 case kIPv4AddressSize: | 105 case kIPv4AddressSize: |
107 return AF_INET; | 106 return AF_INET; |
108 case kIPv6AddressSize: | 107 case kIPv6AddressSize: |
109 return AF_INET6; | 108 return AF_INET6; |
110 default: | 109 default: |
111 NOTREACHED() << "Bad IP address"; | 110 NOTREACHED() << "Bad IP address"; |
112 return AF_UNSPEC; | 111 return AF_UNSPEC; |
113 } | 112 } |
114 } | 113 } |
115 | 114 |
116 bool IPEndPoint::ToSockAddr(struct sockaddr* address, | 115 bool IPEndPoint::ToSockAddr(struct sockaddr* address, |
117 socklen_t* address_length) const { | 116 socklen_t* address_length) const { |
118 DCHECK(address); | 117 DCHECK(address); |
119 DCHECK(address_length); | 118 DCHECK(address_length); |
120 switch (address_.size()) { | 119 switch (address_.size()) { |
121 case kIPv4AddressSize: { | 120 case kIPv4AddressSize: { |
122 if (*address_length < kSockaddrInSize) | 121 if (*address_length < kSockaddrInSize) |
123 return false; | 122 return false; |
124 *address_length = kSockaddrInSize; | 123 *address_length = kSockaddrInSize; |
125 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(address); | 124 struct sockaddr_in* addr = reinterpret_cast<struct sockaddr_in*>(address); |
126 memset(addr, 0, sizeof(struct sockaddr_in)); | 125 memset(addr, 0, sizeof(struct sockaddr_in)); |
127 addr->sin_family = AF_INET; | 126 addr->sin_family = AF_INET; |
128 addr->sin_port = base::HostToNet16(port_); | 127 addr->sin_port = base::HostToNet16(port_); |
129 memcpy(&addr->sin_addr, &address_[0], kIPv4AddressSize); | 128 memcpy(&addr->sin_addr, &address_.bytes()[0], kIPv4AddressSize); |
130 break; | 129 break; |
131 } | 130 } |
132 case kIPv6AddressSize: { | 131 case kIPv6AddressSize: { |
133 if (*address_length < kSockaddrIn6Size) | 132 if (*address_length < kSockaddrIn6Size) |
134 return false; | 133 return false; |
135 *address_length = kSockaddrIn6Size; | 134 *address_length = kSockaddrIn6Size; |
136 struct sockaddr_in6* addr6 = | 135 struct sockaddr_in6* addr6 = |
137 reinterpret_cast<struct sockaddr_in6*>(address); | 136 reinterpret_cast<struct sockaddr_in6*>(address); |
138 memset(addr6, 0, sizeof(struct sockaddr_in6)); | 137 memset(addr6, 0, sizeof(struct sockaddr_in6)); |
139 addr6->sin6_family = AF_INET6; | 138 addr6->sin6_family = AF_INET6; |
140 addr6->sin6_port = base::HostToNet16(port_); | 139 addr6->sin6_port = base::HostToNet16(port_); |
141 memcpy(&addr6->sin6_addr, &address_[0], kIPv6AddressSize); | 140 memcpy(&addr6->sin6_addr, &address_.bytes()[0], kIPv6AddressSize); |
142 break; | 141 break; |
143 } | 142 } |
144 default: | 143 default: |
145 return false; | 144 return false; |
146 } | 145 } |
147 return true; | 146 return true; |
148 } | 147 } |
149 | 148 |
150 bool IPEndPoint::FromSockAddr(const struct sockaddr* sock_addr, | 149 bool IPEndPoint::FromSockAddr(const struct sockaddr* sock_addr, |
151 socklen_t sock_addr_len) { | 150 socklen_t sock_addr_len) { |
152 DCHECK(sock_addr); | 151 DCHECK(sock_addr); |
153 | 152 |
154 const uint8_t* address; | 153 const uint8_t* address; |
155 size_t address_len; | 154 size_t address_len; |
156 uint16_t port; | 155 uint16_t port; |
157 if (!GetIPAddressFromSockAddr(sock_addr, sock_addr_len, &address, | 156 if (!GetIPAddressFromSockAddr(sock_addr, sock_addr_len, &address, |
158 &address_len, &port)) { | 157 &address_len, &port)) { |
159 return false; | 158 return false; |
160 } | 159 } |
161 | 160 |
162 address_.assign(address, address + address_len); | 161 std::vector<uint8_t> ip_address(address, address + address_len); |
162 address_ = net::IPAddress(ip_address); | |
eroman
2016/01/13 23:19:42
There is already a constructor for this:
addres
martijnc
2016/01/14 22:48:16
Done.
| |
163 port_ = port; | 163 port_ = port; |
164 return true; | 164 return true; |
165 } | 165 } |
166 | 166 |
167 std::string IPEndPoint::ToString() const { | 167 std::string IPEndPoint::ToString() const { |
168 return IPAddressToStringWithPort(address_, port_); | 168 return IPAddressToStringWithPort(address_.bytes(), port_); |
martijnc
2016/01/13 22:49:31
Would it be a good idea to add a IPAddress::ToStri
eroman
2016/01/13 23:19:42
Is the pattern used in several other places? If it
martijnc
2016/01/14 22:48:16
No, limited usage. I'll skip this.
| |
169 } | 169 } |
170 | 170 |
171 std::string IPEndPoint::ToStringWithoutPort() const { | 171 std::string IPEndPoint::ToStringWithoutPort() const { |
172 return IPAddressToString(address_); | 172 return address_.ToString(); |
173 } | 173 } |
174 | 174 |
175 bool IPEndPoint::operator<(const IPEndPoint& other) const { | 175 bool IPEndPoint::operator<(const IPEndPoint& other) const { |
176 // Sort IPv4 before IPv6. | 176 // Sort IPv4 before IPv6. |
177 if (address_.size() != other.address_.size()) { | 177 if (address_.size() != other.address_.size()) { |
178 return address_.size() < other.address_.size(); | 178 return address_.size() < other.address_.size(); |
179 } | 179 } |
180 return std::tie(address_, port_) < std::tie(other.address_, other.port_); | 180 return std::tie(address_, port_) < std::tie(other.address_, other.port_); |
181 } | 181 } |
182 | 182 |
183 bool IPEndPoint::operator==(const IPEndPoint& other) const { | 183 bool IPEndPoint::operator==(const IPEndPoint& other) const { |
184 return address_ == other.address_ && port_ == other.port_; | 184 return address_ == other.address_ && port_ == other.port_; |
185 } | 185 } |
186 | 186 |
187 } // namespace net | 187 } // namespace net |
OLD | NEW |