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

Side by Side Diff: runtime/bin/socket_base_win.cc

Issue 2780063002: Pulled a significant portion of Socket implementation into BaseSocket in order to prepare for the s… (Closed)
Patch Set: Pulled a significant portion of Socket implementation into SocketBase in order to prepare for the s… Created 3 years, 8 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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #if !defined(DART_IO_DISABLED) 5 #if !defined(DART_IO_DISABLED)
6 6
7 #include "platform/globals.h" 7 #include "platform/globals.h"
8 #if defined(HOST_OS_WINDOWS) 8 #if defined(HOST_OS_WINDOWS)
9 9
10 #include "bin/socket.h" 10 #include "bin/socket.h"
11 #include "bin/socket_win.h" 11 #include "bin/socket_base_win.h"
12 12
13 #include "bin/builtin.h" 13 #include "bin/builtin.h"
14 #include "bin/eventhandler.h" 14 #include "bin/eventhandler.h"
15 #include "bin/file.h" 15 #include "bin/file.h"
16 #include "bin/lockers.h" 16 #include "bin/lockers.h"
17 #include "bin/log.h" 17 #include "bin/log.h"
18 #include "bin/thread.h" 18 #include "bin/thread.h"
19 #include "bin/utils.h" 19 #include "bin/utils.h"
20 #include "bin/utils_win.h" 20 #include "bin/utils_win.h"
21 21
22 namespace dart { 22 namespace dart {
23 namespace bin { 23 namespace bin {
24 24
25 SocketAddress::SocketAddress(struct sockaddr* sockaddr) { 25 SocketAddress::SocketAddress(struct sockaddr* sockaddr) {
26 ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN); 26 ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
27 RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr); 27 RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr);
28 28
29 // Clear the port before calling WSAAddressToString as WSAAddressToString 29 // Clear the port before calling WSAAddressToString as WSAAddressToString
30 // includes the port in the formatted string. 30 // includes the port in the formatted string.
31 int err = Socket::FormatNumericAddress(*raw, as_string_, INET6_ADDRSTRLEN); 31 int err =
32 SocketBase::FormatNumericAddress(*raw, as_string_, INET6_ADDRSTRLEN);
32 33
33 if (err != 0) { 34 if (err != 0) {
34 as_string_[0] = 0; 35 as_string_[0] = 0;
35 } 36 }
36 memmove(reinterpret_cast<void*>(&addr_), sockaddr, 37 memmove(reinterpret_cast<void*>(&addr_), sockaddr,
37 SocketAddress::GetAddrLength(*raw)); 38 SocketAddress::GetAddrLength(*raw));
38 } 39 }
39 40
40 41
41 bool Socket::FormatNumericAddress(const RawAddr& addr, char* address, int len) { 42 bool SocketBase::FormatNumericAddress(const RawAddr& addr,
43 char* address,
44 int len) {
42 socklen_t salen = SocketAddress::GetAddrLength(addr); 45 socklen_t salen = SocketAddress::GetAddrLength(addr);
43 DWORD l = len; 46 DWORD l = len;
44 RawAddr& raw = const_cast<RawAddr&>(addr); 47 RawAddr& raw = const_cast<RawAddr&>(addr);
45 return WSAAddressToStringA(&raw.addr, salen, NULL, address, &l) != 0; 48 return WSAAddressToStringA(&raw.addr, salen, NULL, address, &l) != 0;
46 } 49 }
47 50
48 51
49 Socket::Socket(intptr_t fd) : ReferenceCounted(), fd_(fd), port_(ILLEGAL_PORT) { 52 intptr_t SocketBase::Available(intptr_t fd) {
50 ASSERT(fd_ != kClosedFd);
51 Handle* handle = reinterpret_cast<Handle*>(fd_);
52 ASSERT(handle != NULL);
53 }
54
55
56 void Socket::SetClosedFd() {
57 ASSERT(fd_ != kClosedFd);
58 Handle* handle = reinterpret_cast<Handle*>(fd_);
59 ASSERT(handle != NULL);
60 handle->Release();
61 fd_ = kClosedFd;
62 }
63
64
65 static Mutex* init_mutex = new Mutex();
66 static bool socket_initialized = false;
67
68 bool Socket::Initialize() {
69 MutexLocker lock(init_mutex);
70 if (socket_initialized) {
71 return true;
72 }
73 int err;
74 WSADATA winsock_data;
75 WORD version_requested = MAKEWORD(2, 2);
76 err = WSAStartup(version_requested, &winsock_data);
77 if (err == 0) {
78 socket_initialized = true;
79 } else {
80 Log::PrintErr("Unable to initialize Winsock: %d\n", WSAGetLastError());
81 }
82 return (err == 0);
83 }
84
85 intptr_t Socket::Available(intptr_t fd) {
86 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); 53 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
87 return client_socket->Available(); 54 return client_socket->Available();
88 } 55 }
89 56
90 57
91 intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) { 58 intptr_t SocketBase::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
92 Handle* handle = reinterpret_cast<Handle*>(fd); 59 Handle* handle = reinterpret_cast<Handle*>(fd);
93 return handle->Read(buffer, num_bytes); 60 return handle->Read(buffer, num_bytes);
94 } 61 }
95 62
96 63
97 intptr_t Socket::RecvFrom(intptr_t fd, 64 intptr_t SocketBase::RecvFrom(intptr_t fd,
98 void* buffer, 65 void* buffer,
99 intptr_t num_bytes, 66 intptr_t num_bytes,
100 RawAddr* addr) { 67 RawAddr* addr) {
101 Handle* handle = reinterpret_cast<Handle*>(fd); 68 Handle* handle = reinterpret_cast<Handle*>(fd);
102 socklen_t addr_len = sizeof(addr->ss); 69 socklen_t addr_len = sizeof(addr->ss);
103 return handle->RecvFrom(buffer, num_bytes, &addr->addr, addr_len); 70 return handle->RecvFrom(buffer, num_bytes, &addr->addr, addr_len);
104 } 71 }
105 72
106 73
107 intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) { 74 intptr_t SocketBase::Write(intptr_t fd,
75 const void* buffer,
76 intptr_t num_bytes) {
108 Handle* handle = reinterpret_cast<Handle*>(fd); 77 Handle* handle = reinterpret_cast<Handle*>(fd);
109 return handle->Write(buffer, num_bytes); 78 return handle->Write(buffer, num_bytes);
110 } 79 }
111 80
112 81
113 intptr_t Socket::SendTo(intptr_t fd, 82 intptr_t SocketBase::SendTo(intptr_t fd,
114 const void* buffer, 83 const void* buffer,
115 intptr_t num_bytes, 84 intptr_t num_bytes,
116 const RawAddr& addr) { 85 const RawAddr& addr) {
117 Handle* handle = reinterpret_cast<Handle*>(fd); 86 Handle* handle = reinterpret_cast<Handle*>(fd);
118 RawAddr& raw = const_cast<RawAddr&>(addr); 87 RawAddr& raw = const_cast<RawAddr&>(addr);
119 return handle->SendTo(buffer, num_bytes, &raw.addr, 88 return handle->SendTo(buffer, num_bytes, &raw.addr,
120 SocketAddress::GetAddrLength(addr)); 89 SocketAddress::GetAddrLength(addr));
121 } 90 }
122 91
123 92
124 intptr_t Socket::GetPort(intptr_t fd) { 93 intptr_t SocketBase::GetPort(intptr_t fd) {
125 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); 94 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
126 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); 95 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd);
127 RawAddr raw; 96 RawAddr raw;
128 socklen_t size = sizeof(raw); 97 socklen_t size = sizeof(raw);
129 if (getsockname(socket_handle->socket(), &raw.addr, &size) == SOCKET_ERROR) { 98 if (getsockname(socket_handle->socket(), &raw.addr, &size) == SOCKET_ERROR) {
130 return 0; 99 return 0;
131 } 100 }
132 return SocketAddress::GetAddrPort(raw); 101 return SocketAddress::GetAddrPort(raw);
133 } 102 }
134 103
135 104
136 SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) { 105 SocketAddress* SocketBase::GetRemotePeer(intptr_t fd, intptr_t* port) {
137 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket()); 106 ASSERT(reinterpret_cast<Handle*>(fd)->is_socket());
138 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd); 107 SocketHandle* socket_handle = reinterpret_cast<SocketHandle*>(fd);
139 RawAddr raw; 108 RawAddr raw;
140 socklen_t size = sizeof(raw); 109 socklen_t size = sizeof(raw);
141 if (getpeername(socket_handle->socket(), &raw.addr, &size)) { 110 if (getpeername(socket_handle->socket(), &raw.addr, &size)) {
142 return NULL; 111 return NULL;
143 } 112 }
144 *port = SocketAddress::GetAddrPort(raw); 113 *port = SocketAddress::GetAddrPort(raw);
145 // Clear the port before calling WSAAddressToString as WSAAddressToString 114 // Clear the port before calling WSAAddressToString as WSAAddressToString
146 // includes the port in the formatted string. 115 // includes the port in the formatted string.
147 SocketAddress::SetAddrPort(&raw, 0); 116 SocketAddress::SetAddrPort(&raw, 0);
148 return new SocketAddress(&raw.addr); 117 return new SocketAddress(&raw.addr);
149 } 118 }
150 119
151 120
152 static intptr_t Create(const RawAddr& addr) { 121 bool SocketBase::IsBindError(intptr_t error_number) {
153 SOCKET s = socket(addr.ss.ss_family, SOCK_STREAM, 0);
154 if (s == INVALID_SOCKET) {
155 return -1;
156 }
157
158 linger l;
159 l.l_onoff = 1;
160 l.l_linger = 10;
161 int status = setsockopt(s, SOL_SOCKET, SO_LINGER, reinterpret_cast<char*>(&l),
162 sizeof(l));
163 if (status != NO_ERROR) {
164 FATAL("Failed setting SO_LINGER on socket");
165 }
166
167 ClientSocket* client_socket = new ClientSocket(s);
168 return reinterpret_cast<intptr_t>(client_socket);
169 }
170
171
172 static intptr_t Connect(intptr_t fd,
173 const RawAddr& addr,
174 const RawAddr& bind_addr) {
175 ASSERT(reinterpret_cast<Handle*>(fd)->is_client_socket());
176 ClientSocket* handle = reinterpret_cast<ClientSocket*>(fd);
177 SOCKET s = handle->socket();
178
179 int status =
180 bind(s, &bind_addr.addr, SocketAddress::GetAddrLength(bind_addr));
181 if (status != NO_ERROR) {
182 int rc = WSAGetLastError();
183 handle->mark_closed(); // Destructor asserts that socket is marked closed.
184 handle->Release();
185 closesocket(s);
186 SetLastError(rc);
187 return -1;
188 }
189
190 LPFN_CONNECTEX connectEx = NULL;
191 GUID guid_connect_ex = WSAID_CONNECTEX;
192 DWORD bytes;
193 status = WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid_connect_ex,
194 sizeof(guid_connect_ex), &connectEx, sizeof(connectEx),
195 &bytes, NULL, NULL);
196 DWORD rc;
197 if (status != SOCKET_ERROR) {
198 handle->EnsureInitialized(EventHandler::delegate());
199
200 OverlappedBuffer* overlapped = OverlappedBuffer::AllocateConnectBuffer();
201
202 status = connectEx(s, &addr.addr, SocketAddress::GetAddrLength(addr), NULL,
203 0, NULL, overlapped->GetCleanOverlapped());
204
205
206 if (status == TRUE) {
207 handle->ConnectComplete(overlapped);
208 return fd;
209 } else if (WSAGetLastError() == ERROR_IO_PENDING) {
210 return fd;
211 }
212 rc = WSAGetLastError();
213 // Cleanup in case of error.
214 OverlappedBuffer::DisposeBuffer(overlapped);
215 handle->Release();
216 } else {
217 rc = WSAGetLastError();
218 }
219 handle->Close();
220 handle->Release();
221 SetLastError(rc);
222 return -1;
223 }
224
225
226 intptr_t Socket::CreateConnect(const RawAddr& addr) {
227 intptr_t fd = Create(addr);
228 if (fd < 0) {
229 return fd;
230 }
231
232 RawAddr bind_addr;
233 memset(&bind_addr, 0, sizeof(bind_addr));
234 bind_addr.ss.ss_family = addr.ss.ss_family;
235 if (addr.ss.ss_family == AF_INET) {
236 bind_addr.in.sin_addr.s_addr = INADDR_ANY;
237 } else {
238 bind_addr.in6.sin6_addr = in6addr_any;
239 }
240
241 return Connect(fd, addr, bind_addr);
242 }
243
244
245 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
246 const RawAddr& source_addr) {
247 intptr_t fd = Create(addr);
248 if (fd < 0) {
249 return fd;
250 }
251
252 return Connect(fd, addr, source_addr);
253 }
254
255
256 bool Socket::IsBindError(intptr_t error_number) {
257 return error_number == WSAEADDRINUSE || error_number == WSAEADDRNOTAVAIL || 122 return error_number == WSAEADDRINUSE || error_number == WSAEADDRNOTAVAIL ||
258 error_number == WSAEINVAL; 123 error_number == WSAEINVAL;
259 } 124 }
260 125
261 126
262 void Socket::GetError(intptr_t fd, OSError* os_error) { 127 void SocketBase::GetError(intptr_t fd, OSError* os_error) {
263 Handle* handle = reinterpret_cast<Handle*>(fd); 128 Handle* handle = reinterpret_cast<Handle*>(fd);
264 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error()); 129 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error());
265 } 130 }
266 131
267 132
268 int Socket::GetType(intptr_t fd) { 133 int SocketBase::GetType(intptr_t fd) {
269 Handle* handle = reinterpret_cast<Handle*>(fd); 134 Handle* handle = reinterpret_cast<Handle*>(fd);
270 switch (GetFileType(handle->handle())) { 135 switch (GetFileType(handle->handle())) {
271 case FILE_TYPE_CHAR: 136 case FILE_TYPE_CHAR:
272 return File::kTerminal; 137 return File::kTerminal;
273 case FILE_TYPE_PIPE: 138 case FILE_TYPE_PIPE:
274 return File::kPipe; 139 return File::kPipe;
275 case FILE_TYPE_DISK: 140 case FILE_TYPE_DISK:
276 return File::kFile; 141 return File::kFile;
277 default: 142 default:
278 return GetLastError == NO_ERROR ? File::kOther : -1; 143 return GetLastError == NO_ERROR ? File::kOther : -1;
279 } 144 }
280 } 145 }
281 146
282 147
283 intptr_t Socket::GetStdioHandle(intptr_t num) { 148 intptr_t SocketBase::GetStdioHandle(intptr_t num) {
284 if (num != 0) { 149 if (num != 0) {
285 return -1; 150 return -1;
286 } 151 }
287 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE); 152 HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);
288 if (handle == INVALID_HANDLE_VALUE) { 153 if (handle == INVALID_HANDLE_VALUE) {
289 return -1; 154 return -1;
290 } 155 }
291 StdHandle* std_handle = new StdHandle(handle); 156 StdHandle* std_handle = new StdHandle(handle);
292 std_handle->MarkDoesNotSupportOverlappedIO(); 157 std_handle->MarkDoesNotSupportOverlappedIO();
293 std_handle->EnsureInitialized(EventHandler::delegate()); 158 std_handle->EnsureInitialized(EventHandler::delegate());
294 return reinterpret_cast<intptr_t>(std_handle); 159 return reinterpret_cast<intptr_t>(std_handle);
295 } 160 }
296 161
297 162
298 intptr_t ServerSocket::Accept(intptr_t fd) { 163 intptr_t ServerSocket::Accept(intptr_t fd) {
299 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd); 164 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd);
300 ClientSocket* client_socket = listen_socket->Accept(); 165 ClientSocket* client_socket = listen_socket->Accept();
301 if (client_socket != NULL) { 166 if (client_socket != NULL) {
302 return reinterpret_cast<intptr_t>(client_socket); 167 return reinterpret_cast<intptr_t>(client_socket);
303 } else { 168 } else {
304 return -1; 169 return -1;
305 } 170 }
306 } 171 }
307 172
308 173
309 AddressList<SocketAddress>* Socket::LookupAddress(const char* host, 174 AddressList<SocketAddress>* SocketBase::LookupAddress(const char* host,
310 int type, 175 int type,
311 OSError** os_error) { 176 OSError** os_error) {
312 Initialize(); 177 Initialize();
313 178
314 // Perform a name lookup for a host name. 179 // Perform a name lookup for a host name.
315 struct addrinfo hints; 180 struct addrinfo hints;
316 memset(&hints, 0, sizeof(hints)); 181 memset(&hints, 0, sizeof(hints));
317 hints.ai_family = SocketAddress::FromType(type); 182 hints.ai_family = SocketAddress::FromType(type);
318 hints.ai_socktype = SOCK_STREAM; 183 hints.ai_socktype = SOCK_STREAM;
319 hints.ai_flags = AI_ADDRCONFIG; 184 hints.ai_flags = AI_ADDRCONFIG;
320 hints.ai_protocol = IPPROTO_TCP; 185 hints.ai_protocol = IPPROTO_TCP;
321 struct addrinfo* info = NULL; 186 struct addrinfo* info = NULL;
(...skipping 23 matching lines...) Expand all
345 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) { 210 if ((c->ai_family == AF_INET) || (c->ai_family == AF_INET6)) {
346 addresses->SetAt(i, new SocketAddress(c->ai_addr)); 211 addresses->SetAt(i, new SocketAddress(c->ai_addr));
347 i++; 212 i++;
348 } 213 }
349 } 214 }
350 freeaddrinfo(info); 215 freeaddrinfo(info);
351 return addresses; 216 return addresses;
352 } 217 }
353 218
354 219
355 bool Socket::ReverseLookup(const RawAddr& addr, 220 bool SocketBase::ReverseLookup(const RawAddr& addr,
356 char* host, 221 char* host,
357 intptr_t host_len, 222 intptr_t host_len,
358 OSError** os_error) { 223 OSError** os_error) {
359 ASSERT(host_len >= NI_MAXHOST); 224 ASSERT(host_len >= NI_MAXHOST);
360 int status = getnameinfo(&addr.addr, SocketAddress::GetAddrLength(addr), host, 225 int status = getnameinfo(&addr.addr, SocketAddress::GetAddrLength(addr), host,
361 host_len, NULL, 0, NI_NAMEREQD); 226 host_len, NULL, 0, NI_NAMEREQD);
362 if (status != 0) { 227 if (status != 0) {
363 ASSERT(*os_error == NULL); 228 ASSERT(*os_error == NULL);
364 DWORD error_code = WSAGetLastError(); 229 DWORD error_code = WSAGetLastError();
365 SetLastError(error_code); 230 SetLastError(error_code);
366 *os_error = new OSError(); 231 *os_error = new OSError();
367 return false; 232 return false;
368 } 233 }
369 return true; 234 return true;
370 } 235 }
371 236
372 237
373 bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) { 238 bool SocketBase::ParseAddress(int type, const char* address, RawAddr* addr) {
374 int result; 239 int result;
375 Utf8ToWideScope system_address(address); 240 Utf8ToWideScope system_address(address);
376 if (type == SocketAddress::TYPE_IPV4) { 241 if (type == SocketAddress::TYPE_IPV4) {
377 result = InetPton(AF_INET, system_address.wide(), &addr->in.sin_addr); 242 result = InetPton(AF_INET, system_address.wide(), &addr->in.sin_addr);
378 } else { 243 } else {
379 ASSERT(type == SocketAddress::TYPE_IPV6); 244 ASSERT(type == SocketAddress::TYPE_IPV6);
380 result = InetPton(AF_INET6, system_address.wide(), &addr->in6.sin6_addr); 245 result = InetPton(AF_INET6, system_address.wide(), &addr->in6.sin6_addr);
381 } 246 }
382 return result == 1; 247 return result == 1;
383 } 248 }
384 249
385 250
386 intptr_t Socket::CreateBindDatagram(const RawAddr& addr, bool reuseAddress) { 251 bool SocketBase::ListInterfacesSupported() {
387 SOCKET s = socket(addr.ss.ss_family, SOCK_DGRAM, IPPROTO_UDP);
388 if (s == INVALID_SOCKET) {
389 return -1;
390 }
391
392 int status;
393 if (reuseAddress) {
394 BOOL optval = true;
395 status = setsockopt(s, SOL_SOCKET, SO_REUSEADDR,
396 reinterpret_cast<const char*>(&optval), sizeof(optval));
397 if (status == SOCKET_ERROR) {
398 DWORD rc = WSAGetLastError();
399 closesocket(s);
400 SetLastError(rc);
401 return -1;
402 }
403 }
404
405 status = bind(s, &addr.addr, SocketAddress::GetAddrLength(addr));
406 if (status == SOCKET_ERROR) {
407 DWORD rc = WSAGetLastError();
408 closesocket(s);
409 SetLastError(rc);
410 return -1;
411 }
412
413 DatagramSocket* datagram_socket = new DatagramSocket(s);
414 datagram_socket->EnsureInitialized(EventHandler::delegate());
415 return reinterpret_cast<intptr_t>(datagram_socket);
416 }
417
418
419 bool Socket::ListInterfacesSupported() {
420 return true; 252 return true;
421 } 253 }
422 254
423 255
424 AddressList<InterfaceSocketAddress>* Socket::ListInterfaces( 256 AddressList<InterfaceSocketAddress>* SocketBase::ListInterfaces(
425 int type, 257 int type,
426 OSError** os_error) { 258 OSError** os_error) {
427 Initialize(); 259 Initialize();
428 260
429 ULONG size = 0; 261 ULONG size = 0;
430 DWORD flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST | 262 DWORD flags = GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_MULTICAST |
431 GAA_FLAG_SKIP_DNS_SERVER; 263 GAA_FLAG_SKIP_DNS_SERVER;
432 // Query the size needed. 264 // Query the size needed.
433 int status = GetAdaptersAddresses(SocketAddress::FromType(type), flags, NULL, 265 int status = GetAdaptersAddresses(SocketAddress::FromType(type), flags, NULL,
434 NULL, &size); 266 NULL, &size);
(...skipping 29 matching lines...) Expand all
464 u->Address.lpSockaddr, 296 u->Address.lpSockaddr,
465 StringUtilsWin::WideToUtf8(a->FriendlyName), a->Ipv6IfIndex)); 297 StringUtilsWin::WideToUtf8(a->FriendlyName), a->Ipv6IfIndex));
466 i++; 298 i++;
467 } 299 }
468 } 300 }
469 free(addrs); 301 free(addrs);
470 return addresses; 302 return addresses;
471 } 303 }
472 304
473 305
474 intptr_t ServerSocket::CreateBindListen(const RawAddr& addr, 306 void SocketBase::Close(intptr_t fd) {
475 intptr_t backlog,
476 bool v6_only) {
477 SOCKET s = socket(addr.ss.ss_family, SOCK_STREAM, IPPROTO_TCP);
478 if (s == INVALID_SOCKET) {
479 return -1;
480 }
481
482 BOOL optval = true;
483 int status =
484 setsockopt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,
485 reinterpret_cast<const char*>(&optval), sizeof(optval));
486 if (status == SOCKET_ERROR) {
487 DWORD rc = WSAGetLastError();
488 closesocket(s);
489 SetLastError(rc);
490 return -1;
491 }
492
493 if (addr.ss.ss_family == AF_INET6) {
494 optval = v6_only;
495 setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
496 reinterpret_cast<const char*>(&optval), sizeof(optval));
497 }
498
499 status = bind(s, &addr.addr, SocketAddress::GetAddrLength(addr));
500 if (status == SOCKET_ERROR) {
501 DWORD rc = WSAGetLastError();
502 closesocket(s);
503 SetLastError(rc);
504 return -1;
505 }
506
507 ListenSocket* listen_socket = new ListenSocket(s);
508
509 // Test for invalid socket port 65535 (some browsers disallow it).
510 if ((SocketAddress::GetAddrPort(addr) == 0) &&
511 (Socket::GetPort(reinterpret_cast<intptr_t>(listen_socket)) == 65535)) {
512 // Don't close fd until we have created new. By doing that we ensure another
513 // port.
514 intptr_t new_s = CreateBindListen(addr, backlog, v6_only);
515 DWORD rc = WSAGetLastError();
516 closesocket(s);
517 listen_socket->Release();
518 SetLastError(rc);
519 return new_s;
520 }
521
522 status = listen(s, backlog > 0 ? backlog : SOMAXCONN);
523 if (status == SOCKET_ERROR) {
524 DWORD rc = WSAGetLastError();
525 closesocket(s);
526 listen_socket->Release();
527 SetLastError(rc);
528 return -1;
529 }
530
531 return reinterpret_cast<intptr_t>(listen_socket);
532 }
533
534
535 bool ServerSocket::StartAccept(intptr_t fd) {
536 ListenSocket* listen_socket = reinterpret_cast<ListenSocket*>(fd);
537 listen_socket->EnsureInitialized(EventHandler::delegate());
538 // Always keep 5 outstanding accepts going, to enhance performance.
539 for (int i = 0; i < 5; i++) {
540 if (!listen_socket->IssueAccept()) {
541 DWORD rc = WSAGetLastError();
542 listen_socket->Close();
543 if (!listen_socket->HasPendingAccept()) {
544 // Delete socket now, if there are no pending accepts. Otherwise,
545 // the event-handler will take care of deleting it.
546 listen_socket->Release();
547 }
548 SetLastError(rc);
549 return false;
550 }
551 }
552 return true;
553 }
554
555
556 void Socket::Close(intptr_t fd) {
557 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd); 307 ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
558 client_socket->Close(); 308 client_socket->Close();
559 } 309 }
560 310
561 311
562 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) { 312 bool SocketBase::GetNoDelay(intptr_t fd, bool* enabled) {
563 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 313 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
564 int on; 314 int on;
565 socklen_t len = sizeof(on); 315 socklen_t len = sizeof(on);
566 int err = getsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY, 316 int err = getsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY,
567 reinterpret_cast<char*>(&on), &len); 317 reinterpret_cast<char*>(&on), &len);
568 if (err == 0) { 318 if (err == 0) {
569 *enabled = (on == 1); 319 *enabled = (on == 1);
570 } 320 }
571 return (err == 0); 321 return (err == 0);
572 } 322 }
573 323
574 324
575 bool Socket::SetNoDelay(intptr_t fd, bool enabled) { 325 bool SocketBase::SetNoDelay(intptr_t fd, bool enabled) {
576 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 326 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
577 int on = enabled ? 1 : 0; 327 int on = enabled ? 1 : 0;
578 return setsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY, 328 return setsockopt(handle->socket(), IPPROTO_TCP, TCP_NODELAY,
579 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 329 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
580 } 330 }
581 331
582 332
583 bool Socket::GetMulticastLoop(intptr_t fd, intptr_t protocol, bool* enabled) { 333 bool SocketBase::GetMulticastLoop(intptr_t fd,
334 intptr_t protocol,
335 bool* enabled) {
584 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 336 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
585 uint8_t on; 337 uint8_t on;
586 socklen_t len = sizeof(on); 338 socklen_t len = sizeof(on);
587 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 339 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
588 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP 340 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP
589 : IPV6_MULTICAST_LOOP; 341 : IPV6_MULTICAST_LOOP;
590 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&on), 342 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&on),
591 &len) == 0) { 343 &len) == 0) {
592 *enabled = (on == 1); 344 *enabled = (on == 1);
593 return true; 345 return true;
594 } 346 }
595 return false; 347 return false;
596 } 348 }
597 349
598 350
599 bool Socket::SetMulticastLoop(intptr_t fd, intptr_t protocol, bool enabled) { 351 bool SocketBase::SetMulticastLoop(intptr_t fd,
352 intptr_t protocol,
353 bool enabled) {
600 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 354 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
601 int on = enabled ? 1 : 0; 355 int on = enabled ? 1 : 0;
602 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 356 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
603 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP 357 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_LOOP
604 : IPV6_MULTICAST_LOOP; 358 : IPV6_MULTICAST_LOOP;
605 return setsockopt(handle->socket(), level, optname, 359 return setsockopt(handle->socket(), level, optname,
606 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 360 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
607 } 361 }
608 362
609 363
610 bool Socket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) { 364 bool SocketBase::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) {
611 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 365 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
612 uint8_t v; 366 uint8_t v;
613 socklen_t len = sizeof(v); 367 socklen_t len = sizeof(v);
614 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 368 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
615 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL 369 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL
616 : IPV6_MULTICAST_HOPS; 370 : IPV6_MULTICAST_HOPS;
617 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&v), 371 if (getsockopt(handle->socket(), level, optname, reinterpret_cast<char*>(&v),
618 &len) == 0) { 372 &len) == 0) {
619 *value = v; 373 *value = v;
620 return true; 374 return true;
621 } 375 }
622 return false; 376 return false;
623 } 377 }
624 378
625 379
626 bool Socket::SetMulticastHops(intptr_t fd, intptr_t protocol, int value) { 380 bool SocketBase::SetMulticastHops(intptr_t fd, intptr_t protocol, int value) {
627 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 381 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
628 int v = value; 382 int v = value;
629 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6; 383 int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
630 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL 384 int optname = protocol == SocketAddress::TYPE_IPV4 ? IP_MULTICAST_TTL
631 : IPV6_MULTICAST_HOPS; 385 : IPV6_MULTICAST_HOPS;
632 return setsockopt(handle->socket(), level, optname, 386 return setsockopt(handle->socket(), level, optname,
633 reinterpret_cast<char*>(&v), sizeof(v)) == 0; 387 reinterpret_cast<char*>(&v), sizeof(v)) == 0;
634 } 388 }
635 389
636 390
637 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) { 391 bool SocketBase::GetBroadcast(intptr_t fd, bool* enabled) {
638 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 392 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
639 int on; 393 int on;
640 socklen_t len = sizeof(on); 394 socklen_t len = sizeof(on);
641 int err = getsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST, 395 int err = getsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST,
642 reinterpret_cast<char*>(&on), &len); 396 reinterpret_cast<char*>(&on), &len);
643 if (err == 0) { 397 if (err == 0) {
644 *enabled = (on == 1); 398 *enabled = (on == 1);
645 } 399 }
646 return (err == 0); 400 return (err == 0);
647 } 401 }
648 402
649 403
650 bool Socket::SetBroadcast(intptr_t fd, bool enabled) { 404 bool SocketBase::SetBroadcast(intptr_t fd, bool enabled) {
651 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 405 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
652 int on = enabled ? 1 : 0; 406 int on = enabled ? 1 : 0;
653 return setsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST, 407 return setsockopt(handle->socket(), SOL_SOCKET, SO_BROADCAST,
654 reinterpret_cast<char*>(&on), sizeof(on)) == 0; 408 reinterpret_cast<char*>(&on), sizeof(on)) == 0;
655 } 409 }
656 410
657 411
658 bool Socket::JoinMulticast(intptr_t fd, 412 bool SocketBase::JoinMulticast(intptr_t fd,
659 const RawAddr& addr, 413 const RawAddr& addr,
660 const RawAddr&, 414 const RawAddr&,
661 int interfaceIndex) { 415 int interfaceIndex) {
662 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 416 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
663 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 417 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
664 struct group_req mreq; 418 struct group_req mreq;
665 mreq.gr_interface = interfaceIndex; 419 mreq.gr_interface = interfaceIndex;
666 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 420 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
667 return setsockopt(handle->socket(), proto, MCAST_JOIN_GROUP, 421 return setsockopt(handle->socket(), proto, MCAST_JOIN_GROUP,
668 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0; 422 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0;
669 } 423 }
670 424
671 425
672 bool Socket::LeaveMulticast(intptr_t fd, 426 bool SocketBase::LeaveMulticast(intptr_t fd,
673 const RawAddr& addr, 427 const RawAddr& addr,
674 const RawAddr&, 428 const RawAddr&,
675 int interfaceIndex) { 429 int interfaceIndex) {
676 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd); 430 SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
677 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6; 431 int proto = addr.addr.sa_family == AF_INET ? IPPROTO_IP : IPPROTO_IPV6;
678 struct group_req mreq; 432 struct group_req mreq;
679 mreq.gr_interface = interfaceIndex; 433 mreq.gr_interface = interfaceIndex;
680 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr)); 434 memmove(&mreq.gr_group, &addr.ss, SocketAddress::GetAddrLength(addr));
681 return setsockopt(handle->socket(), proto, MCAST_LEAVE_GROUP, 435 return setsockopt(handle->socket(), proto, MCAST_LEAVE_GROUP,
682 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0; 436 reinterpret_cast<char*>(&mreq), sizeof(mreq)) == 0;
683 } 437 }
684 438
685 } // namespace bin 439 } // namespace bin
686 } // namespace dart 440 } // namespace dart
687 441
688 #endif // defined(HOST_OS_WINDOWS) 442 #endif // defined(HOST_OS_WINDOWS)
689 443
690 #endif // !defined(DART_IO_DISABLED) 444 #endif // !defined(DART_IO_DISABLED)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698