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

Unified Diff: runtime/bin/socket_win.cc

Issue 16514010: Add NetworkAdaptor to dart:io. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Add support for win, mac and android. Created 7 years, 6 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 3a3fd9da622cb1eff8f09165ceb9a1a8381b3a56..fd54cc5a19a61eae0f8373e78cf57e6cd37a80db 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -16,9 +16,9 @@
namespace dart {
namespace bin {
-SocketAddress::SocketAddress(struct addrinfo* addrinfo) {
+SocketAddress::SocketAddress(struct sockaddr* sockaddr) {
ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
- RawAddr* raw = reinterpret_cast<RawAddr*>(addrinfo->ai_addr);
+ RawAddr* raw = reinterpret_cast<RawAddr*>(sockaddr);
// Clear the port before calling WSAAddressToString as WSAAddressToString
// includes the port in the formatted string.
@@ -33,8 +33,8 @@ SocketAddress::SocketAddress(struct addrinfo* addrinfo) {
as_string_[0] = 0;
}
memmove(reinterpret_cast<void *>(&addr_),
- addrinfo->ai_addr,
- addrinfo->ai_addrlen);
+ sockaddr,
+ SocketAddress::GetAddrLength(raw));
}
bool Socket::Initialize() {
@@ -142,7 +142,7 @@ intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
SocketHandle* handle = reinterpret_cast<SocketHandle*>(fd);
SOCKET s = handle->socket();
SocketAddress::SetAddrPort(&addr, port);
- int status = connect(s, &addr.addr, SocketAddress::GetAddrLength(addr));
+ int status = connect(s, &addr.addr, SocketAddress::GetAddrLength(&addr));
if (status == SOCKET_ERROR) {
DWORD rc = WSAGetLastError();
ClientSocket* client_socket = reinterpret_cast<ClientSocket*>(fd);
@@ -216,9 +216,9 @@ intptr_t ServerSocket::Accept(intptr_t fd) {
}
-SocketAddresses* Socket::LookupAddress(const char* host,
- int type,
- OSError** os_error) {
+AddressList<SocketAddress>* Socket::LookupAddress(const char* host,
+ int type,
+ OSError** os_error) {
Initialize();
// Perform a name lookup for a host name.
@@ -241,11 +241,11 @@ SocketAddresses* Socket::LookupAddress(const char* host,
for (struct addrinfo* c = info; c != NULL; c = c->ai_next) {
if (c->ai_family == AF_INET || c->ai_family == AF_INET6) count++;
}
- SocketAddresses* addresses = new SocketAddresses(count);
+ AddressList<SocketAddress>* addresses = new AddressList<SocketAddress>(count);
intptr_t i = 0;
for (struct addrinfo* c = info; c != NULL; c = c->ai_next) {
if (c->ai_family == AF_INET || c->ai_family == AF_INET6) {
- addresses->SetAt(i, new SocketAddress(c));
+ addresses->SetAt(i, new SocketAddress(c->ai_addr));
i++;
}
}
@@ -254,6 +254,57 @@ SocketAddresses* Socket::LookupAddress(const char* host,
}
+AddressList<InterfaceSocketAddress>* Socket::ListInterfaces(
+ int type,
+ OSError** os_error) {
+ Initialize();
+
+ ULONG size = 0;
+ // Query the size needed.
+ GetAdaptersAddresses(SocketAddress::FromType(type),
Søren Gjesse 2013/06/20 18:22:05 You could consider adding the flags: GAA_FLAG_SKI
Anders Johnsen 2013/06/21 07:58:35 Done.
+ 0,
+ NULL,
+ NULL,
+ &size);
+ PIP_ADAPTER_ADDRESSES addrs =
Søren Gjesse 2013/06/20 18:22:05 We normally use the *. That is IP_ADAPTER_ADDRESSE
Anders Johnsen 2013/06/21 07:58:35 Done.
+ reinterpret_cast<PIP_ADAPTER_ADDRESSES>(malloc(size));
Søren Gjesse 2013/06/20 18:22:05 Ditto and more below.
Anders Johnsen 2013/06/21 07:58:35 Done.
+ // Get the addresses now we have the right buffer.
Søren Gjesse 2013/06/20 18:22:05 Add an if (status == ERROR_BUFFER_OVERFLOW) around
Anders Johnsen 2013/06/21 07:58:35 Done.
+ int status = GetAdaptersAddresses(SocketAddress::FromType(type),
+ 0,
+ NULL,
+ addrs,
+ &size);
+ if (status != NO_ERROR) {
+ ASSERT(*os_error == NULL);
+ DWORD error_code = WSAGetLastError();
+ SetLastError(error_code);
+ *os_error = new OSError();
+ return NULL;
+ }
+ intptr_t count = 0;
+ for (PIP_ADAPTER_ADDRESSES a = addrs; a != NULL; a = a->Next) {
+ for (PIP_ADAPTER_UNICAST_ADDRESS u = a->FirstUnicastAddress;
+ u != NULL; u = u->Next) {
+ count++;
+ }
+ }
+ AddressList<InterfaceSocketAddress>* addresses =
+ new AddressList<InterfaceSocketAddress>(count);
+ intptr_t i = 0;
+ for (PIP_ADAPTER_ADDRESSES a = addrs; a != NULL; a = a->Next) {
+ for (PIP_ADAPTER_UNICAST_ADDRESS u = a->FirstUnicastAddress;
+ u != NULL; u = u->Next) {
+ addresses->SetAt(i, new InterfaceSocketAddress(
+ u->Address.lpSockaddr,
+ StringUtils::WideToUtf8(a->FriendlyName)));
+ i++;
+ }
+ }
+ free(addrs);
+ return addresses;
+}
+
+
intptr_t ServerSocket::CreateBindListen(RawAddr addr,
intptr_t port,
intptr_t backlog,
@@ -288,7 +339,7 @@ intptr_t ServerSocket::CreateBindListen(RawAddr addr,
SocketAddress::SetAddrPort(&addr, port);
status = bind(s,
&addr.addr,
- SocketAddress::GetAddrLength(addr));
+ SocketAddress::GetAddrLength(&addr));
if (status == SOCKET_ERROR) {
DWORD rc = WSAGetLastError();
closesocket(s);

Powered by Google App Engine
This is Rietveld 408576698