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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: runtime/bin/socket_win.cc
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 05b2d865a7f6b6ce3f7fdae20d2b14a144cf1032..e366430a2d7f9ce1d05722d924fc20f1d6d06c83 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -129,7 +129,7 @@ SocketAddress* Socket::GetRemotePeer(intptr_t fd, intptr_t* port) {
}
-intptr_t Socket::Create(RawAddr addr) {
+static intptr_t Create(RawAddr addr) {
SOCKET s = socket(addr.ss.ss_family, SOCK_STREAM, 0);
if (s == INVALID_SOCKET) {
return -1;
@@ -152,23 +152,17 @@ intptr_t Socket::Create(RawAddr addr) {
}
-intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
+static intptr_t Connect(
+ intptr_t fd, RawAddr addr, const intptr_t port, RawAddr bind_addr) {
ASSERT(reinterpret_cast<Handle*>(fd)->is_client_socket());
ClientSocket* handle = reinterpret_cast<ClientSocket*>(fd);
SOCKET s = handle->socket();
- RawAddr bind_addr;
- memset(&bind_addr, 0, sizeof(bind_addr));
- bind_addr.ss.ss_family = addr.ss.ss_family;
- if (addr.ss.ss_family == AF_INET) {
- bind_addr.in.sin_addr.s_addr = INADDR_ANY;
- } else {
- bind_addr.in6.sin6_addr = in6addr_any;
- }
int status = bind(
s, &bind_addr.addr, SocketAddress::GetAddrLength(&bind_addr));
if (status != NO_ERROR) {
int rc = WSAGetLastError();
+ handle->mark_closed(); // Destructor asserts that socket is marked closed.
delete handle;
closesocket(s);
SetLastError(rc);
@@ -223,13 +217,34 @@ intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
}
-intptr_t Socket::CreateConnect(RawAddr addr, const intptr_t port) {
- intptr_t fd = Socket::Create(addr);
+intptr_t Socket::CreateConnect(const RawAddr& addr, const intptr_t port) {
+ intptr_t fd = Create(addr);
+ if (fd < 0) {
+ return fd;
+ }
+
+ RawAddr bind_addr;
+ memset(&bind_addr, 0, sizeof(bind_addr));
+ bind_addr.ss.ss_family = addr.ss.ss_family;
+ if (addr.ss.ss_family == AF_INET) {
+ bind_addr.in.sin_addr.s_addr = INADDR_ANY;
+ } else {
+ bind_addr.in6.sin6_addr = in6addr_any;
+ }
+
+ return Connect(fd, addr, port, bind_addr);
+}
+
+
+intptr_t Socket::CreateBindConnect(const RawAddr& addr,
+ const intptr_t port,
+ const RawAddr& source_addr) {
+ intptr_t fd = Create(addr);
if (fd < 0) {
return fd;
}
- return Socket::Connect(fd, addr, port);
+ return Connect(fd, addr, port, source_addr);
}

Powered by Google App Engine
This is Rietveld 408576698