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

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

Issue 908873002: Add support to specify the source address for socket connect (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Added dart2js patch file Created 5 years, 10 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 | Annotate | Revision Log
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 #include "platform/globals.h" 5 #include "platform/globals.h"
6 #if defined(TARGET_OS_WINDOWS) 6 #if defined(TARGET_OS_WINDOWS)
7 7
8 #include "bin/builtin.h" 8 #include "bin/builtin.h"
9 #include "bin/eventhandler.h" 9 #include "bin/eventhandler.h"
10 #include "bin/file.h" 10 #include "bin/file.h"
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 return NULL; 122 return NULL;
123 } 123 }
124 *port = SocketAddress::GetAddrPort(&raw); 124 *port = SocketAddress::GetAddrPort(&raw);
125 // Clear the port before calling WSAAddressToString as WSAAddressToString 125 // Clear the port before calling WSAAddressToString as WSAAddressToString
126 // includes the port in the formatted string. 126 // includes the port in the formatted string.
127 SocketAddress::SetAddrPort(&raw, 0); 127 SocketAddress::SetAddrPort(&raw, 0);
128 return new SocketAddress(&raw.addr); 128 return new SocketAddress(&raw.addr);
129 } 129 }
130 130
131 131
132 intptr_t Socket::Create(RawAddr addr) { 132 static intptr_t Create(RawAddr addr) {
133 SOCKET s = socket(addr.ss.ss_family, SOCK_STREAM, 0); 133 SOCKET s = socket(addr.ss.ss_family, SOCK_STREAM, 0);
134 if (s == INVALID_SOCKET) { 134 if (s == INVALID_SOCKET) {
135 return -1; 135 return -1;
136 } 136 }
137 137
138 linger l; 138 linger l;
139 l.l_onoff = 1; 139 l.l_onoff = 1;
140 l.l_linger = 10; 140 l.l_linger = 10;
141 int status = setsockopt(s, 141 int status = setsockopt(s,
142 SOL_SOCKET, 142 SOL_SOCKET,
143 SO_LINGER, 143 SO_LINGER,
144 reinterpret_cast<char*>(&l), 144 reinterpret_cast<char*>(&l),
145 sizeof(l)); 145 sizeof(l));
146 if (status != NO_ERROR) { 146 if (status != NO_ERROR) {
147 FATAL("Failed setting SO_LINGER on socket"); 147 FATAL("Failed setting SO_LINGER on socket");
148 } 148 }
149 149
150 ClientSocket* client_socket = new ClientSocket(s); 150 ClientSocket* client_socket = new ClientSocket(s);
151 return reinterpret_cast<intptr_t>(client_socket); 151 return reinterpret_cast<intptr_t>(client_socket);
152 } 152 }
153 153
154 154
155 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) { 155 static intptr_t Connect(
156 intptr_t fd, RawAddr addr, const intptr_t port, RawAddr bind_addr) {
156 ASSERT(reinterpret_cast<Handle*>(fd)->is_client_socket()); 157 ASSERT(reinterpret_cast<Handle*>(fd)->is_client_socket());
157 ClientSocket* handle = reinterpret_cast<ClientSocket*>(fd); 158 ClientSocket* handle = reinterpret_cast<ClientSocket*>(fd);
158 SOCKET s = handle->socket(); 159 SOCKET s = handle->socket();
159 160
160 RawAddr bind_addr;
161 memset(&bind_addr, 0, sizeof(bind_addr));
162 bind_addr.ss.ss_family = addr.ss.ss_family;
163 if (addr.ss.ss_family == AF_INET) {
164 bind_addr.in.sin_addr.s_addr = INADDR_ANY;
165 } else {
166 bind_addr.in6.sin6_addr = in6addr_any;
167 }
168 int status = bind( 161 int status = bind(
169 s, &bind_addr.addr, SocketAddress::GetAddrLength(&bind_addr)); 162 s, &bind_addr.addr, SocketAddress::GetAddrLength(&bind_addr));
170 if (status != NO_ERROR) { 163 if (status != NO_ERROR) {
171 int rc = WSAGetLastError(); 164 int rc = WSAGetLastError();
165 handle->mark_closed(); // Destructor asserts that socket is marked closed.
172 delete handle; 166 delete handle;
173 closesocket(s); 167 closesocket(s);
174 SetLastError(rc); 168 SetLastError(rc);
175 return -1; 169 return -1;
176 } 170 }
177 171
178 SocketAddress::SetAddrPort(&addr, port); 172 SocketAddress::SetAddrPort(&addr, port);
179 173
180 LPFN_CONNECTEX connectEx = NULL; 174 LPFN_CONNECTEX connectEx = NULL;
181 GUID guid_connect_ex = WSAID_CONNECTEX; 175 GUID guid_connect_ex = WSAID_CONNECTEX;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 } else { 210 } else {
217 rc = WSAGetLastError(); 211 rc = WSAGetLastError();
218 } 212 }
219 handle->Close(); 213 handle->Close();
220 delete handle; 214 delete handle;
221 SetLastError(rc); 215 SetLastError(rc);
222 return -1; 216 return -1;
223 } 217 }
224 218
225 219
226 intptr_t Socket::CreateConnect(RawAddr addr, const intptr_t port) { 220 intptr_t Socket::CreateConnect(const RawAddr& addr, const intptr_t port) {
227 intptr_t fd = Socket::Create(addr); 221 intptr_t fd = Create(addr);
228 if (fd < 0) { 222 if (fd < 0) {
229 return fd; 223 return fd;
230 } 224 }
231 225
232 return Socket::Connect(fd, addr, port); 226 RawAddr bind_addr;
227 memset(&bind_addr, 0, sizeof(bind_addr));
228 bind_addr.ss.ss_family = addr.ss.ss_family;
229 if (addr.ss.ss_family == AF_INET) {
230 bind_addr.in.sin_addr.s_addr = INADDR_ANY;
231 } else {
232 bind_addr.in6.sin6_addr = in6addr_any;
233 }
234
235 return Connect(fd, addr, port, bind_addr);
233 } 236 }
234 237
235 238
239 intptr_t Socket::CreateBindConnect(const RawAddr& addr,
240 const intptr_t port,
241 const RawAddr& source_addr) {
242 intptr_t fd = Create(addr);
243 if (fd < 0) {
244 return fd;
245 }
246
247 return Connect(fd, addr, port, source_addr);
248 }
249
250
236 void Socket::GetError(intptr_t fd, OSError* os_error) { 251 void Socket::GetError(intptr_t fd, OSError* os_error) {
237 Handle* handle = reinterpret_cast<Handle*>(fd); 252 Handle* handle = reinterpret_cast<Handle*>(fd);
238 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error()); 253 os_error->SetCodeAndMessage(OSError::kSystem, handle->last_error());
239 } 254 }
240 255
241 256
242 int Socket::GetType(intptr_t fd) { 257 int Socket::GetType(intptr_t fd) {
243 Handle* handle = reinterpret_cast<Handle*>(fd); 258 Handle* handle = reinterpret_cast<Handle*>(fd);
244 switch (GetFileType(handle->handle())) { 259 switch (GetFileType(handle->handle())) {
245 case FILE_TYPE_CHAR: return File::kTerminal; 260 case FILE_TYPE_CHAR: return File::kTerminal;
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 proto, 712 proto,
698 MCAST_LEAVE_GROUP, 713 MCAST_LEAVE_GROUP,
699 reinterpret_cast<char *>(&mreq), 714 reinterpret_cast<char *>(&mreq),
700 sizeof(mreq)) == 0; 715 sizeof(mreq)) == 0;
701 } 716 }
702 717
703 } // namespace bin 718 } // namespace bin
704 } // namespace dart 719 } // namespace dart
705 720
706 #endif // defined(TARGET_OS_WINDOWS) 721 #endif // defined(TARGET_OS_WINDOWS)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698