Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: net/base/ip_endpoint.cc

Issue 1565303002: Change IPEndpoint::address() to return a net::IPAddress (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Feedback eroman Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698