| OLD | NEW |
| 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 patch class RawServerSocket { | 5 patch class RawServerSocket { |
| 6 /* patch */ static Future<RawServerSocket> bind(address, | 6 /* patch */ static Future<RawServerSocket> bind(address, |
| 7 int port, | 7 int port, |
| 8 {int backlog: 0, | 8 {int backlog: 0, |
| 9 bool v6Only: false}) { | 9 bool v6Only: false}) { |
| 10 return _RawServerSocket.bind(address, port, backlog, v6Only); | 10 return _RawServerSocket.bind(address, port, backlog, v6Only); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 includeLinkLocal: includeLinkLocal, | 55 includeLinkLocal: includeLinkLocal, |
| 56 type: type); | 56 type: type); |
| 57 } | 57 } |
| 58 } | 58 } |
| 59 | 59 |
| 60 class _InternetAddress implements InternetAddress { | 60 class _InternetAddress implements InternetAddress { |
| 61 static const int _ADDRESS_LOOPBACK_IP_V4 = 0; | 61 static const int _ADDRESS_LOOPBACK_IP_V4 = 0; |
| 62 static const int _ADDRESS_LOOPBACK_IP_V6 = 1; | 62 static const int _ADDRESS_LOOPBACK_IP_V6 = 1; |
| 63 static const int _ADDRESS_ANY_IP_V4 = 2; | 63 static const int _ADDRESS_ANY_IP_V4 = 2; |
| 64 static const int _ADDRESS_ANY_IP_V6 = 3; | 64 static const int _ADDRESS_ANY_IP_V6 = 3; |
| 65 static const int _IPV4_ADDR_OFFSET = 4; | 65 static const int _IPV4_ADDR_LENGTH = 4; |
| 66 static const int _IPV6_ADDR_OFFSET = 8; | |
| 67 static const int _IPV6_ADDR_LENGTH = 16; | 66 static const int _IPV6_ADDR_LENGTH = 16; |
| 68 | 67 |
| 69 static _InternetAddress LOOPBACK_IP_V4 = | 68 static _InternetAddress LOOPBACK_IP_V4 = |
| 70 new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V4); | 69 new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V4); |
| 71 static _InternetAddress LOOPBACK_IP_V6 = | 70 static _InternetAddress LOOPBACK_IP_V6 = |
| 72 new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V6); | 71 new _InternetAddress.fixed(_ADDRESS_LOOPBACK_IP_V6); |
| 73 static _InternetAddress ANY_IP_V4 = | 72 static _InternetAddress ANY_IP_V4 = |
| 74 new _InternetAddress.fixed(_ADDRESS_ANY_IP_V4); | 73 new _InternetAddress.fixed(_ADDRESS_ANY_IP_V4); |
| 75 static _InternetAddress ANY_IP_V6 = | 74 static _InternetAddress ANY_IP_V6 = |
| 76 new _InternetAddress.fixed(_ADDRESS_ANY_IP_V6); | 75 new _InternetAddress.fixed(_ADDRESS_ANY_IP_V6); |
| 77 | 76 |
| 78 final InternetAddressType type; | |
| 79 final String address; | 77 final String address; |
| 80 final String _host; | 78 final String _host; |
| 81 final Uint8List _sockaddr_storage; | 79 final Uint8List _in_addr; |
| 80 |
| 81 InternetAddressType get type => |
| 82 _in_addr.length == _IPV4_ADDR_LENGTH ? InternetAddressType.IP_V4 |
| 83 : InternetAddressType.IP_V6; |
| 82 | 84 |
| 83 String get host => _host != null ? _host : address; | 85 String get host => _host != null ? _host : address; |
| 84 | 86 |
| 85 bool get isLoopback { | 87 bool get isLoopback { |
| 86 switch (type) { | 88 switch (type) { |
| 87 case InternetAddressType.IP_V4: | 89 case InternetAddressType.IP_V4: |
| 88 return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 127; | 90 return _in_addr[0] == 127; |
| 89 | 91 |
| 90 case InternetAddressType.IP_V6: | 92 case InternetAddressType.IP_V6: |
| 91 for (int i = 0; i < _IPV6_ADDR_LENGTH - 1; i++) { | 93 for (int i = 0; i < _IPV6_ADDR_LENGTH - 1; i++) { |
| 92 if (_sockaddr_storage[_IPV6_ADDR_OFFSET + i] != 0) return false; | 94 if (_in_addr[i] != 0) return false; |
| 93 } | 95 } |
| 94 int lastByteIndex = _IPV6_ADDR_OFFSET + _IPV6_ADDR_LENGTH - 1; | 96 return _in_addr[_IPV6_ADDR_LENGTH - 1] == 1; |
| 95 return _sockaddr_storage[lastByteIndex] == 1; | |
| 96 } | 97 } |
| 97 } | 98 } |
| 98 | 99 |
| 99 bool get isLinkLocal { | 100 bool get isLinkLocal { |
| 100 switch (type) { | 101 switch (type) { |
| 101 case InternetAddressType.IP_V4: | 102 case InternetAddressType.IP_V4: |
| 102 // Checking for 169.254.0.0/16. | 103 // Checking for 169.254.0.0/16. |
| 103 return _sockaddr_storage[_IPV4_ADDR_OFFSET] == 169 && | 104 return _in_addr[0] == 169 && _in_addr[1] == 254; |
| 104 _sockaddr_storage[_IPV4_ADDR_OFFSET + 1] == 254; | |
| 105 | 105 |
| 106 case InternetAddressType.IP_V6: | 106 case InternetAddressType.IP_V6: |
| 107 // Checking for fe80::/10. | 107 // Checking for fe80::/10. |
| 108 return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFE && | 108 return _in_addr[0] == 0xFE && (_in_addr[1] & 0xB0) == 0x80; |
| 109 (_sockaddr_storage[_IPV6_ADDR_OFFSET + 1] & 0xB0) == 0x80; | |
| 110 } | 109 } |
| 111 } | 110 } |
| 112 | 111 |
| 113 bool get isMulticast { | 112 bool get isMulticast { |
| 114 switch (type) { | 113 switch (type) { |
| 115 case InternetAddressType.IP_V4: | 114 case InternetAddressType.IP_V4: |
| 116 // Checking for 224.0.0.0 through 239.255.255.255. | 115 // Checking for 224.0.0.0 through 239.255.255.255. |
| 117 return _sockaddr_storage[_IPV4_ADDR_OFFSET] >= 224 && | 116 return _in_addr[0] >= 224 && _in_addr[0] < 240; |
| 118 _sockaddr_storage[_IPV4_ADDR_OFFSET] < 240; | |
| 119 | 117 |
| 120 case InternetAddressType.IP_V6: | 118 case InternetAddressType.IP_V6: |
| 121 // Checking for ff00::/8. | 119 // Checking for ff00::/8. |
| 122 return _sockaddr_storage[_IPV6_ADDR_OFFSET] == 0xFF; | 120 return _in_addr[0] == 0xFF; |
| 123 } | 121 } |
| 124 } | 122 } |
| 125 | 123 |
| 126 Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); | 124 Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this); |
| 127 | 125 |
| 128 _InternetAddress(InternetAddressType this.type, | 126 _InternetAddress(String this.address, |
| 129 String this.address, | |
| 130 String this._host, | 127 String this._host, |
| 131 List<int> this._sockaddr_storage); | 128 List<int> this._in_addr); |
| 132 | 129 |
| 133 factory _InternetAddress.parse(String address) { | 130 factory _InternetAddress.parse(String address) { |
| 134 var type = address.indexOf(':') == -1 | 131 var in_addr = _parse(address); |
| 135 ? InternetAddressType.IP_V4 | 132 if (in_addr == null) { |
| 136 : InternetAddressType.IP_V6; | |
| 137 var raw = _parse(type._value, address); | |
| 138 if (raw == null) { | |
| 139 throw new ArgumentError("Invalid internet address $address"); | 133 throw new ArgumentError("Invalid internet address $address"); |
| 140 } | 134 } |
| 141 return new _InternetAddress(type, address, null, raw); | 135 return new _InternetAddress(address, null, in_addr); |
| 142 } | 136 } |
| 143 | 137 |
| 144 factory _InternetAddress.fixed(int id) { | 138 factory _InternetAddress.fixed(int id) { |
| 145 var sockaddr = _fixed(id); | |
| 146 switch (id) { | 139 switch (id) { |
| 147 case _ADDRESS_LOOPBACK_IP_V4: | 140 case _ADDRESS_LOOPBACK_IP_V4: |
| 148 return new _InternetAddress( | 141 var in_addr = new Uint8List(_IPV4_ADDR_LENGTH); |
| 149 InternetAddressType.IP_V4, "127.0.0.1", null, sockaddr); | 142 in_addr[0] = 127; |
| 143 in_addr[_IPV4_ADDR_LENGTH - 1] = 1; |
| 144 return new _InternetAddress("127.0.0.1", null, in_addr); |
| 150 case _ADDRESS_LOOPBACK_IP_V6: | 145 case _ADDRESS_LOOPBACK_IP_V6: |
| 151 return new _InternetAddress( | 146 var in_addr = new Uint8List(_IPV6_ADDR_LENGTH); |
| 152 InternetAddressType.IP_V6, "::1", null, sockaddr); | 147 in_addr[_IPV6_ADDR_LENGTH - 1] = 1; |
| 148 return new _InternetAddress("::1", null, in_addr); |
| 153 case _ADDRESS_ANY_IP_V4: | 149 case _ADDRESS_ANY_IP_V4: |
| 154 return new _InternetAddress( | 150 var in_addr = new Uint8List(_IPV4_ADDR_LENGTH); |
| 155 InternetAddressType.IP_V4, "0.0.0.0", "0.0.0.0", sockaddr); | 151 return new _InternetAddress("0.0.0.0", "0.0.0.0", in_addr); |
| 156 case _ADDRESS_ANY_IP_V6: | 152 case _ADDRESS_ANY_IP_V6: |
| 157 return new _InternetAddress( | 153 var in_addr = new Uint8List(_IPV6_ADDR_LENGTH); |
| 158 InternetAddressType.IP_V6, "::", "::", sockaddr); | 154 return new _InternetAddress("::", "::", in_addr); |
| 159 default: | 155 default: |
| 160 assert(false); | 156 assert(false); |
| 161 throw new ArgumentError(); | 157 throw new ArgumentError(); |
| 162 } | 158 } |
| 163 } | 159 } |
| 164 | 160 |
| 165 // Create a clone of this _InternetAddress replacing the host. | 161 // Create a clone of this _InternetAddress replacing the host. |
| 166 _InternetAddress _cloneWithNewHost(String host) { | 162 _InternetAddress _cloneWithNewHost(String host) { |
| 167 return new _InternetAddress( | 163 return new _InternetAddress( |
| 168 type, address, host, new Uint8List.fromList(_sockaddr_storage)); | 164 address, host, new Uint8List.fromList(_in_addr)); |
| 169 } | 165 } |
| 170 | 166 |
| 171 bool operator ==(other) { | 167 bool operator ==(other) { |
| 172 if (!(other is _InternetAddress)) return false; | 168 if (!(other is _InternetAddress)) return false; |
| 173 if (other.type != type) return false; | 169 if (other.type != type) return false; |
| 174 bool equals = true; | 170 bool equals = true; |
| 175 for (int i = 0; i < _sockaddr_storage.length && equals; i++) { | 171 for (int i = 0; i < _in_addr.length && equals; i++) { |
| 176 equals = other._sockaddr_storage[i] == _sockaddr_storage[i]; | 172 equals = other._in_addr[i] == _in_addr[i]; |
| 177 } | 173 } |
| 178 return equals; | 174 return equals; |
| 179 } | 175 } |
| 180 | 176 |
| 181 int get hashCode { | 177 int get hashCode { |
| 182 int result = 1; | 178 int result = 1; |
| 183 for (int i = 0; i < _sockaddr_storage.length; i++) { | 179 for (int i = 0; i < _in_addr.length; i++) { |
| 184 result = (result * 31 + _sockaddr_storage[i]) & 0x3FFFFFFF; | 180 result = (result * 31 + _in_addr[i]) & 0x3FFFFFFF; |
| 185 } | 181 } |
| 186 return result; | 182 return result; |
| 187 } | 183 } |
| 188 | 184 |
| 189 String toString() { | 185 String toString() { |
| 190 return "InternetAddress('$address', ${type.name})"; | 186 return "InternetAddress('$address', ${type.name})"; |
| 191 } | 187 } |
| 192 | 188 |
| 193 static Uint8List _fixed(int id) native "InternetAddress_Fixed"; | 189 static Uint8List _parse(String address) native "InternetAddress_Parse"; |
| 194 static Uint8List _parse(int type, String address) | |
| 195 native "InternetAddress_Parse"; | |
| 196 } | 190 } |
| 197 | 191 |
| 198 class _NetworkInterface implements NetworkInterface { | 192 class _NetworkInterface implements NetworkInterface { |
| 199 final String name; | 193 final String name; |
| 200 final int index; | 194 final int index; |
| 201 final List<InternetAddress> addresses = []; | 195 final List<InternetAddress> addresses = []; |
| 202 | 196 |
| 203 _NetworkInterface(this.name, this.index); | 197 _NetworkInterface(this.name, this.index); |
| 204 | 198 |
| 205 String toString() { | 199 String toString() { |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 | 271 |
| 278 static Future<List<InternetAddress>> lookup( | 272 static Future<List<InternetAddress>> lookup( |
| 279 String host, {InternetAddressType type: InternetAddressType.ANY}) { | 273 String host, {InternetAddressType type: InternetAddressType.ANY}) { |
| 280 return _IOService.dispatch(_SOCKET_LOOKUP, [host, type._value]) | 274 return _IOService.dispatch(_SOCKET_LOOKUP, [host, type._value]) |
| 281 .then((response) { | 275 .then((response) { |
| 282 if (isErrorResponse(response)) { | 276 if (isErrorResponse(response)) { |
| 283 throw createError(response, "Failed host lookup: '$host'"); | 277 throw createError(response, "Failed host lookup: '$host'"); |
| 284 } else { | 278 } else { |
| 285 return response.skip(1).map((result) { | 279 return response.skip(1).map((result) { |
| 286 var type = new InternetAddressType._from(result[0]); | 280 var type = new InternetAddressType._from(result[0]); |
| 287 return new _InternetAddress(type, result[1], host, result[2]); | 281 return new _InternetAddress(result[1], host, result[2]); |
| 288 }).toList(); | 282 }).toList(); |
| 289 } | 283 } |
| 290 }); | 284 }); |
| 291 } | 285 } |
| 292 | 286 |
| 293 static Future<InternetAddress> reverseLookup(InternetAddress addr) { | 287 static Future<InternetAddress> reverseLookup(InternetAddress addr) { |
| 294 return _IOService.dispatch(_SOCKET_REVERSE_LOOKUP, [addr._sockaddr_storage]) | 288 return _IOService.dispatch(_SOCKET_REVERSE_LOOKUP, [addr._in_addr]) |
| 295 .then((response) { | 289 .then((response) { |
| 296 if (isErrorResponse(response)) { | 290 if (isErrorResponse(response)) { |
| 297 throw createError(response, "Failed reverse host lookup", addr); | 291 throw createError(response, "Failed reverse host lookup", addr); |
| 298 } else { | 292 } else { |
| 299 return addr._cloneWithNewHost(response); | 293 return addr._cloneWithNewHost(response); |
| 300 } | 294 } |
| 301 }); | 295 }); |
| 302 } | 296 } |
| 303 | 297 |
| 304 static Future<List<NetworkInterface>> listInterfaces({ | 298 static Future<List<NetworkInterface>> listInterfaces({ |
| 305 bool includeLoopback: false, | 299 bool includeLoopback: false, |
| 306 bool includeLinkLocal: false, | 300 bool includeLinkLocal: false, |
| 307 InternetAddressType type: InternetAddressType.ANY}) { | 301 InternetAddressType type: InternetAddressType.ANY}) { |
| 308 return _IOService.dispatch(_SOCKET_LIST_INTERFACES, [type._value]) | 302 return _IOService.dispatch(_SOCKET_LIST_INTERFACES, [type._value]) |
| 309 .then((response) { | 303 .then((response) { |
| 310 if (isErrorResponse(response)) { | 304 if (isErrorResponse(response)) { |
| 311 throw createError(response, "Failed listing interfaces"); | 305 throw createError(response, "Failed listing interfaces"); |
| 312 } else { | 306 } else { |
| 313 var map = response.skip(1) | 307 var map = response.skip(1) |
| 314 .fold(new Map<String, NetworkInterface>(), (map, result) { | 308 .fold(new Map<String, NetworkInterface>(), (map, result) { |
| 315 var type = new InternetAddressType._from(result[0]); | 309 var type = new InternetAddressType._from(result[0]); |
| 316 var name = result[3]; | 310 var name = result[3]; |
| 317 var index = result[4]; | 311 var index = result[4]; |
| 318 var address = new _InternetAddress( | 312 var address = new _InternetAddress(result[1], "", result[2]); |
| 319 type, result[1], "", result[2]); | |
| 320 if (!includeLinkLocal && address.isLinkLocal) return map; | 313 if (!includeLinkLocal && address.isLinkLocal) return map; |
| 321 if (!includeLoopback && address.isLoopback) return map; | 314 if (!includeLoopback && address.isLoopback) return map; |
| 322 map.putIfAbsent( | 315 map.putIfAbsent( |
| 323 name, () => new _NetworkInterface(name, index)); | 316 name, () => new _NetworkInterface(name, index)); |
| 324 map[name].addresses.add(address); | 317 map[name].addresses.add(address); |
| 325 return map; | 318 return map; |
| 326 }); | 319 }); |
| 327 return map.values.toList(); | 320 return map.values.toList(); |
| 328 } | 321 } |
| 329 }); | 322 }); |
| 330 } | 323 } |
| 331 | 324 |
| 332 static Future<_NativeSocket> connect(host, int port) { | 325 static Future<_NativeSocket> connect(host, int port) { |
| 333 return new Future.value(host) | 326 return new Future.value(host) |
| 334 .then((host) { | 327 .then((host) { |
| 335 if (host is _InternetAddress) return host; | 328 if (host is _InternetAddress) return host; |
| 336 return lookup(host) | 329 return lookup(host) |
| 337 .then((list) { | 330 .then((list) { |
| 338 if (list.length == 0) { | 331 if (list.length == 0) { |
| 339 throw createError(response, "Failed host lookup: '$host'"); | 332 throw createError(response, "Failed host lookup: '$host'"); |
| 340 } | 333 } |
| 341 return list[0]; | 334 return list[0]; |
| 342 }); | 335 }); |
| 343 }) | 336 }) |
| 344 .then((address) { | 337 .then((address) { |
| 345 var socket = new _NativeSocket.normal(); | 338 var socket = new _NativeSocket.normal(); |
| 346 socket.address = address; | 339 socket.address = address; |
| 347 var result = socket.nativeCreateConnect( | 340 var result = socket.nativeCreateConnect( |
| 348 address._sockaddr_storage, port); | 341 address._in_addr, port); |
| 349 if (result is OSError) { | 342 if (result is OSError) { |
| 350 throw createError(result, "Connection failed", address, port); | 343 throw createError(result, "Connection failed", address, port); |
| 351 } else { | 344 } else { |
| 352 socket.port; // Query the local port, for error messages. | 345 socket.port; // Query the local port, for error messages. |
| 353 var completer = new Completer(); | 346 var completer = new Completer(); |
| 354 // Setup handlers for receiving the first write event which | 347 // Setup handlers for receiving the first write event which |
| 355 // indicate that the socket is fully connected. | 348 // indicate that the socket is fully connected. |
| 356 socket.setHandlers( | 349 socket.setHandlers( |
| 357 write: () { | 350 write: () { |
| 358 socket.setListening(read: false, write: false); | 351 socket.setListening(read: false, write: false); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 380 .then((list) { | 373 .then((list) { |
| 381 if (list.length == 0) { | 374 if (list.length == 0) { |
| 382 throw createError(response, "Failed host lookup: '$host'"); | 375 throw createError(response, "Failed host lookup: '$host'"); |
| 383 } | 376 } |
| 384 return list[0]; | 377 return list[0]; |
| 385 }); | 378 }); |
| 386 }) | 379 }) |
| 387 .then((address) { | 380 .then((address) { |
| 388 var socket = new _NativeSocket.listen(); | 381 var socket = new _NativeSocket.listen(); |
| 389 socket.address = address; | 382 socket.address = address; |
| 390 var result = socket.nativeCreateBindListen(address._sockaddr_storage, | 383 var result = socket.nativeCreateBindListen(address._in_addr, |
| 391 port, | 384 port, |
| 392 backlog, | 385 backlog, |
| 393 v6Only); | 386 v6Only); |
| 394 if (result is OSError) { | 387 if (result is OSError) { |
| 395 throw new SocketException("Failed to create server socket", | 388 throw new SocketException("Failed to create server socket", |
| 396 osError: result, | 389 osError: result, |
| 397 address: address, | 390 address: address, |
| 398 port: port); | 391 port: port); |
| 399 } | 392 } |
| 400 if (port != 0) socket.localPort = port; | 393 if (port != 0) socket.localPort = port; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 411 .then((list) { | 404 .then((list) { |
| 412 if (list.length == 0) { | 405 if (list.length == 0) { |
| 413 throw createError(response, "Failed host lookup: '$host'"); | 406 throw createError(response, "Failed host lookup: '$host'"); |
| 414 } | 407 } |
| 415 return list[0]; | 408 return list[0]; |
| 416 }); | 409 }); |
| 417 }) | 410 }) |
| 418 .then((address) { | 411 .then((address) { |
| 419 var socket = new _NativeSocket.datagram(address); | 412 var socket = new _NativeSocket.datagram(address); |
| 420 var result = socket.nativeCreateBindDatagram( | 413 var result = socket.nativeCreateBindDatagram( |
| 421 address._sockaddr_storage, port, reuseAddress); | 414 address._in_addr, port, reuseAddress); |
| 422 if (result is OSError) { | 415 if (result is OSError) { |
| 423 throw new SocketException("Failed to create datagram socket", | 416 throw new SocketException("Failed to create datagram socket", |
| 424 osError: result, | 417 osError: result, |
| 425 address: address, | 418 address: address, |
| 426 port: port); | 419 port: port); |
| 427 } | 420 } |
| 428 if (port != 0) socket.localPort = port; | 421 if (port != 0) socket.localPort = port; |
| 429 return socket; | 422 return socket; |
| 430 }); | 423 }); |
| 431 } | 424 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 } | 511 } |
| 519 | 512 |
| 520 int send(List<int> buffer, int offset, int bytes, | 513 int send(List<int> buffer, int offset, int bytes, |
| 521 InternetAddress address, int port) { | 514 InternetAddress address, int port) { |
| 522 if (isClosing || isClosed) return 0; | 515 if (isClosing || isClosed) return 0; |
| 523 _BufferAndStart bufferAndStart = | 516 _BufferAndStart bufferAndStart = |
| 524 _ensureFastAndSerializableByteData( | 517 _ensureFastAndSerializableByteData( |
| 525 buffer, offset, bytes); | 518 buffer, offset, bytes); |
| 526 var result = nativeSendTo( | 519 var result = nativeSendTo( |
| 527 bufferAndStart.buffer, bufferAndStart.start, bytes, | 520 bufferAndStart.buffer, bufferAndStart.start, bytes, |
| 528 address._sockaddr_storage, port); | 521 address._in_addr, port); |
| 529 if (result is OSError) { | 522 if (result is OSError) { |
| 530 scheduleMicrotask(() => reportError(result, "Send failed")); | 523 scheduleMicrotask(() => reportError(result, "Send failed")); |
| 531 result = 0; | 524 result = 0; |
| 532 } | 525 } |
| 533 return result; | 526 return result; |
| 534 } | 527 } |
| 535 | 528 |
| 536 _NativeSocket accept() { | 529 _NativeSocket accept() { |
| 537 // Don't issue accept if we're closing. | 530 // Don't issue accept if we're closing. |
| 538 if (isClosing || isClosed) return null; | 531 if (isClosing || isClosed) return null; |
| 539 var socket = new _NativeSocket.normal(); | 532 var socket = new _NativeSocket.normal(); |
| 540 if (nativeAccept(socket) != true) return null; | 533 if (nativeAccept(socket) != true) return null; |
| 541 socket.localPort = localPort; | 534 socket.localPort = localPort; |
| 542 socket.address = address; | 535 socket.address = address; |
| 543 return socket; | 536 return socket; |
| 544 } | 537 } |
| 545 | 538 |
| 546 int get port { | 539 int get port { |
| 547 if (localPort != 0) return localPort; | 540 if (localPort != 0) return localPort; |
| 548 return localPort = nativeGetPort(); | 541 return localPort = nativeGetPort(); |
| 549 } | 542 } |
| 550 | 543 |
| 551 int get remotePort { | 544 int get remotePort { |
| 552 return nativeGetRemotePeer()[1]; | 545 return nativeGetRemotePeer()[1]; |
| 553 } | 546 } |
| 554 | 547 |
| 555 InternetAddress get remoteAddress { | 548 InternetAddress get remoteAddress { |
| 556 var result = nativeGetRemotePeer()[0]; | 549 var result = nativeGetRemotePeer()[0]; |
| 557 var type = new InternetAddressType._from(result[0]); | 550 var type = new InternetAddressType._from(result[0]); |
| 558 return new _InternetAddress(type, result[1], null, result[2]); | 551 return new _InternetAddress(result[1], null, result[2]); |
| 559 } | 552 } |
| 560 | 553 |
| 561 // Multiplexes socket events to the socket handlers. | 554 // Multiplexes socket events to the socket handlers. |
| 562 void multiplex(int events) { | 555 void multiplex(int events) { |
| 563 canActivateEvents = false; | 556 canActivateEvents = false; |
| 564 for (int i = FIRST_EVENT; i <= LAST_EVENT; i++) { | 557 for (int i = FIRST_EVENT; i <= LAST_EVENT; i++) { |
| 565 if (((events & (1 << i)) != 0)) { | 558 if (((events & (1 << i)) != 0)) { |
| 566 if ((i == CLOSED_EVENT || i == READ_EVENT) && isClosedRead) continue; | 559 if ((i == CLOSED_EVENT || i == READ_EVENT) && isClosedRead) continue; |
| 567 if (i == CLOSED_EVENT && | 560 if (i == CLOSED_EVENT && |
| 568 typeFlags != TYPE_LISTENING_SOCKET && | 561 typeFlags != TYPE_LISTENING_SOCKET && |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 794 } | 787 } |
| 795 } else { | 788 } else { |
| 796 return null; | 789 return null; |
| 797 } | 790 } |
| 798 } | 791 } |
| 799 | 792 |
| 800 void joinMulticast(InternetAddress addr, NetworkInterface interface) { | 793 void joinMulticast(InternetAddress addr, NetworkInterface interface) { |
| 801 var interfaceAddr = multicastAddress(addr, interface); | 794 var interfaceAddr = multicastAddress(addr, interface); |
| 802 var interfaceIndex = interface == null ? 0 : interface.index; | 795 var interfaceIndex = interface == null ? 0 : interface.index; |
| 803 var result = nativeJoinMulticast( | 796 var result = nativeJoinMulticast( |
| 804 addr._sockaddr_storage, | 797 addr._in_addr, |
| 805 interfaceAddr == null ? null : interfaceAddr._sockaddr_storage, | 798 interfaceAddr == null ? null : interfaceAddr._in_addr, |
| 806 interfaceIndex); | 799 interfaceIndex); |
| 807 if (result is OSError) throw result; | 800 if (result is OSError) throw result; |
| 808 } | 801 } |
| 809 | 802 |
| 810 void leaveMulticast(InternetAddress addr, NetworkInterface interface) { | 803 void leaveMulticast(InternetAddress addr, NetworkInterface interface) { |
| 811 var interfaceAddr = multicastAddress(addr, interface); | 804 var interfaceAddr = multicastAddress(addr, interface); |
| 812 var interfaceIndex = interface == null ? 0 : interface.index; | 805 var interfaceIndex = interface == null ? 0 : interface.index; |
| 813 var result = nativeLeaveMulticast( | 806 var result = nativeLeaveMulticast( |
| 814 addr._sockaddr_storage, | 807 addr._in_addr, |
| 815 interfaceAddr == null ? null : interfaceAddr._sockaddr_storage, | 808 interfaceAddr == null ? null : interfaceAddr._in_addr, |
| 816 interfaceIndex); | 809 interfaceIndex); |
| 817 if (result is OSError) throw result; | 810 if (result is OSError) throw result; |
| 818 } | 811 } |
| 819 | 812 |
| 820 void nativeSetSocketId(int id) native "Socket_SetSocketId"; | 813 void nativeSetSocketId(int id) native "Socket_SetSocketId"; |
| 821 nativeAvailable() native "Socket_Available"; | 814 nativeAvailable() native "Socket_Available"; |
| 822 nativeRead(int len) native "Socket_Read"; | 815 nativeRead(int len) native "Socket_Read"; |
| 823 nativeRecvFrom() native "Socket_RecvFrom"; | 816 nativeRecvFrom() native "Socket_RecvFrom"; |
| 824 nativeWrite(List<int> buffer, int offset, int bytes) | 817 nativeWrite(List<int> buffer, int offset, int bytes) |
| 825 native "Socket_WriteList"; | 818 native "Socket_WriteList"; |
| (...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1544 void _onSubscriptionStateChange() { | 1537 void _onSubscriptionStateChange() { |
| 1545 if (_controller.hasListener) { | 1538 if (_controller.hasListener) { |
| 1546 _resume(); | 1539 _resume(); |
| 1547 } else { | 1540 } else { |
| 1548 close(); | 1541 close(); |
| 1549 } | 1542 } |
| 1550 } | 1543 } |
| 1551 } | 1544 } |
| 1552 | 1545 |
| 1553 Datagram _makeDatagram(List<int> data, | 1546 Datagram _makeDatagram(List<int> data, |
| 1554 bool ipV6, | |
| 1555 String address, | 1547 String address, |
| 1556 List<int> sockaddr_storage, | 1548 List<int> in_addr, |
| 1557 int port) { | 1549 int port) { |
| 1558 var addressType = | |
| 1559 ipV6 ? InternetAddressType.IP_V6 : InternetAddressType.IP_V4; | |
| 1560 return new Datagram( | 1550 return new Datagram( |
| 1561 data, | 1551 data, |
| 1562 new _InternetAddress(addressType, address, null, sockaddr_storage), | 1552 new _InternetAddress(address, null, in_addr), |
| 1563 port); | 1553 port); |
| 1564 } | 1554 } |
| OLD | NEW |