| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 part of dart.io; | |
| 6 | |
| 7 | |
| 8 /** | |
| 9 * [InternetAddressType] is the type an [InternetAddress]. Currently, | |
| 10 * IP version 4 (IPv4) and IP version 6 (IPv6) are supported. | |
| 11 */ | |
| 12 class InternetAddressType { | |
| 13 static const InternetAddressType IP_V4 = const InternetAddressType._(0); | |
| 14 static const InternetAddressType IP_V6 = const InternetAddressType._(1); | |
| 15 static const InternetAddressType ANY = const InternetAddressType._(-1); | |
| 16 | |
| 17 final int _value; | |
| 18 | |
| 19 const InternetAddressType._(this._value); | |
| 20 | |
| 21 factory InternetAddressType._from(int value) { | |
| 22 if (value == 0) return IP_V4; | |
| 23 if (value == 1) return IP_V6; | |
| 24 throw new ArgumentError("Invalid type: $value"); | |
| 25 } | |
| 26 | |
| 27 /** | |
| 28 * Get the name of the type, e.g. "IP_V4" or "IP_V6". | |
| 29 */ | |
| 30 String get name { | |
| 31 switch (_value) { | |
| 32 case -1: return "ANY"; | |
| 33 case 0: return "IP_V4"; | |
| 34 case 1: return "IP_V6"; | |
| 35 default: throw new ArgumentError("Invalid InternetAddress"); | |
| 36 } | |
| 37 } | |
| 38 | |
| 39 String toString() => "InternetAddressType: $name"; | |
| 40 } | |
| 41 | |
| 42 | |
| 43 /** | |
| 44 * An internet address. | |
| 45 * | |
| 46 * This object holds an internet address. If this internet address | |
| 47 * is the result of a DNS lookup, the address also holds the hostname | |
| 48 * used to make the lookup. | |
| 49 * An Internet address combined with a port number represents an | |
| 50 * endpoint to which a socket can connect or a listening socket can | |
| 51 * bind. | |
| 52 */ | |
| 53 abstract class InternetAddress { | |
| 54 /** | |
| 55 * IP version 4 loopback address. Use this address when listening on | |
| 56 * or connecting to the loopback adapter using IP version 4 (IPv4). | |
| 57 */ | |
| 58 external static InternetAddress get LOOPBACK_IP_V4; | |
| 59 | |
| 60 /** | |
| 61 * IP version 6 loopback address. Use this address when listening on | |
| 62 * or connecting to the loopback adapter using IP version 6 (IPv6). | |
| 63 */ | |
| 64 external static InternetAddress get LOOPBACK_IP_V6; | |
| 65 | |
| 66 /** | |
| 67 * IP version 4 any address. Use this address when listening on | |
| 68 * all adapters IP addresses using IP version 4 (IPv4). | |
| 69 */ | |
| 70 external static InternetAddress get ANY_IP_V4; | |
| 71 | |
| 72 /** | |
| 73 * IP version 6 any address. Use this address when listening on | |
| 74 * all adapters IP addresses using IP version 6 (IPv6). | |
| 75 */ | |
| 76 external static InternetAddress get ANY_IP_V6; | |
| 77 | |
| 78 /** | |
| 79 * The [type] of the [InternetAddress] specified what IP protocol. | |
| 80 */ | |
| 81 InternetAddressType type; | |
| 82 | |
| 83 /** | |
| 84 * The numeric address of the host. For IPv4 addresses this is using | |
| 85 * the dotted-decimal notation. For IPv6 it is using the | |
| 86 * hexadecimal representation. | |
| 87 */ | |
| 88 String get address; | |
| 89 | |
| 90 /** | |
| 91 * The host used to lookup the address. If there is no host | |
| 92 * associated with the address this returns the numeric address. | |
| 93 */ | |
| 94 String get host; | |
| 95 | |
| 96 /** | |
| 97 * Get the raw address of this [InternetAddress]. The result is either a | |
| 98 * 4 or 16 byte long list. The returned list is a copy, making it possible | |
| 99 * to change the list without modifying the [InternetAddress]. | |
| 100 */ | |
| 101 List<int> get rawAddress; | |
| 102 | |
| 103 /** | |
| 104 * Returns true if the [InternetAddress] is a loopback address. | |
| 105 */ | |
| 106 bool get isLoopback; | |
| 107 | |
| 108 /** | |
| 109 * Returns true if the [InternetAddress]s scope is a link-local. | |
| 110 */ | |
| 111 bool get isLinkLocal; | |
| 112 | |
| 113 /** | |
| 114 * Returns true if the [InternetAddress]s scope is multicast. | |
| 115 */ | |
| 116 bool get isMulticast; | |
| 117 | |
| 118 /** | |
| 119 * Creates a new [InternetAddress] from a numeric address. | |
| 120 * | |
| 121 * If the address in [address] is not a numeric IPv4 | |
| 122 * (dotted-decimal notation) or IPv6 (hexadecimal representation). | |
| 123 * address [ArgumentError] is thrown. | |
| 124 */ | |
| 125 external factory InternetAddress(String address); | |
| 126 | |
| 127 /** | |
| 128 * Perform a reverse dns lookup on the [address], creating a new | |
| 129 * [InternetAddress] where the host field set to the result. | |
| 130 */ | |
| 131 Future<InternetAddress> reverse(); | |
| 132 | |
| 133 /** | |
| 134 * Lookup a host, returning a Future of a list of | |
| 135 * [InternetAddress]s. If [type] is [InternetAddressType.ANY], it | |
| 136 * will lookup both IP version 4 (IPv4) and IP version 6 (IPv6) | |
| 137 * addresses. If [type] is either [InternetAddressType.IP_V4] or | |
| 138 * [InternetAddressType.IP_V6] it will only lookup addresses of the | |
| 139 * specified type. The order of the list can, and most likely will, | |
| 140 * change over time. | |
| 141 */ | |
| 142 external static Future<List<InternetAddress>> lookup( | |
| 143 String host, {InternetAddressType type: InternetAddressType.ANY}); | |
| 144 | |
| 145 /** | |
| 146 * Clones the given [address] with the new [host]. | |
| 147 * | |
| 148 * The [address] must be an [InternetAddress] that was created with one | |
| 149 * of the static methods of this class. | |
| 150 */ | |
| 151 external static InternetAddress _cloneWithNewHost( | |
| 152 InternetAddress address, String host); | |
| 153 } | |
| 154 | |
| 155 | |
| 156 /** | |
| 157 * A [NetworkInterface] represents an active network interface on the current | |
| 158 * system. It contains a list of [InternetAddress]es that are bound to the | |
| 159 * interface. | |
| 160 */ | |
| 161 abstract class NetworkInterface { | |
| 162 /** | |
| 163 * Get the name of the [NetworkInterface]. | |
| 164 */ | |
| 165 String get name; | |
| 166 | |
| 167 /** | |
| 168 * Get the index of the [NetworkInterface]. | |
| 169 */ | |
| 170 String get index; | |
| 171 | |
| 172 /** | |
| 173 * Get a list of [InternetAddress]es currently bound to this | |
| 174 * [NetworkInterface]. | |
| 175 */ | |
| 176 List<InternetAddress> get addresses; | |
| 177 | |
| 178 /** | |
| 179 * Whether [list] is supported. | |
| 180 * | |
| 181 * [list] is currently unsupported on Android. | |
| 182 */ | |
| 183 external static bool get listSupported; | |
| 184 | |
| 185 /** | |
| 186 * Query the system for [NetworkInterface]s. | |
| 187 * | |
| 188 * If [includeLoopback] is `true`, the returned list will include the | |
| 189 * loopback device. Default is `false`. | |
| 190 * | |
| 191 * If [includeLinkLocal] is `true`, the list of addresses of the returned | |
| 192 * [NetworkInterface]s, may include link local addresses. Default is `false`. | |
| 193 * | |
| 194 * If [type] is either [InternetAddressType.IP_V4] or | |
| 195 * [InternetAddressType.IP_V6] it will only lookup addresses of the | |
| 196 * specified type. Default is [InternetAddressType.ANY]. | |
| 197 */ | |
| 198 external static Future<List<NetworkInterface>> list({ | |
| 199 bool includeLoopback: false, | |
| 200 bool includeLinkLocal: false, | |
| 201 InternetAddressType type: InternetAddressType.ANY}); | |
| 202 } | |
| 203 | |
| 204 | |
| 205 /** | |
| 206 * A [RawServerSocket] represents a listening socket, and provides a | |
| 207 * stream of low-level [RawSocket] objects, one for each connection | |
| 208 * made to the listening socket. | |
| 209 * | |
| 210 * See [RawSocket] for more info. | |
| 211 */ | |
| 212 abstract class RawServerSocket implements Stream<RawSocket> { | |
| 213 /** | |
| 214 * Returns a future for a [:RawServerSocket:]. When the future | |
| 215 * completes the server socket is bound to the given [address] and | |
| 216 * [port] and has started listening on it. | |
| 217 * | |
| 218 * The [address] can either be a [String] or an | |
| 219 * [InternetAddress]. If [address] is a [String], [bind] will | |
| 220 * perform a [InternetAddress.lookup] and use the first value in the | |
| 221 * list. To listen on the loopback adapter, which will allow only | |
| 222 * incoming connections from the local host, use the value | |
| 223 * [InternetAddress.LOOPBACK_IP_V4] or | |
| 224 * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming | |
| 225 * connection from the network use either one of the values | |
| 226 * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to | |
| 227 * bind to all interfaces or the IP address of a specific interface. | |
| 228 * | |
| 229 * If an IP version 6 (IPv6) address is used, both IP version 6 | |
| 230 * (IPv6) and version 4 (IPv4) connections will be accepted. To | |
| 231 * restrict this to version 6 (IPv6) only, use [v6Only] to set | |
| 232 * version 6 only. | |
| 233 * | |
| 234 * If [port] has the value [:0:] an ephemeral port will | |
| 235 * be chosen by the system. The actual port used can be retrieved | |
| 236 * using the [:port:] getter. | |
| 237 * | |
| 238 * The optional argument [backlog] can be used to specify the listen | |
| 239 * backlog for the underlying OS listen setup. If [backlog] has the | |
| 240 * value of [:0:] (the default) a reasonable value will be chosen by | |
| 241 * the system. | |
| 242 * | |
| 243 * The optional argument [shared] specifies whether additional RawServerSocket | |
| 244 * objects can bind to the same combination of `address`, `port` and `v6Only`. | |
| 245 * If `shared` is `true` and more `RawServerSocket`s from this isolate or | |
| 246 * other isolates are bound to the port, then the incoming connections will be | |
| 247 * distributed among all the bound `RawServerSocket`s. Connections can be | |
| 248 * distributed over multiple isolates this way. | |
| 249 */ | |
| 250 external static Future<RawServerSocket> bind(address, | |
| 251 int port, | |
| 252 {int backlog: 0, | |
| 253 bool v6Only: false, | |
| 254 bool shared: false}); | |
| 255 | |
| 256 /** | |
| 257 * Returns the port used by this socket. | |
| 258 */ | |
| 259 int get port; | |
| 260 | |
| 261 /** | |
| 262 * Returns the address used by this socket. | |
| 263 */ | |
| 264 InternetAddress get address; | |
| 265 | |
| 266 /** | |
| 267 * Closes the socket. The returned future completes when the socket | |
| 268 * is fully closed and is no longer bound. | |
| 269 */ | |
| 270 Future<RawServerSocket> close(); | |
| 271 } | |
| 272 | |
| 273 | |
| 274 /** | |
| 275 * A [ServerSocket] represents a listening socket, and provides a | |
| 276 * stream of [Socket] objects, one for each connection made to the | |
| 277 * listening socket. | |
| 278 * | |
| 279 * See [Socket] for more info. | |
| 280 */ | |
| 281 abstract class ServerSocket implements Stream<Socket> { | |
| 282 /** | |
| 283 * Returns a future for a [:ServerSocket:]. When the future | |
| 284 * completes the server socket is bound to the given [address] and | |
| 285 * [port] and has started listening on it. | |
| 286 * | |
| 287 * The [address] can either be a [String] or an | |
| 288 * [InternetAddress]. If [address] is a [String], [bind] will | |
| 289 * perform a [InternetAddress.lookup] and use the first value in the | |
| 290 * list. To listen on the loopback adapter, which will allow only | |
| 291 * incoming connections from the local host, use the value | |
| 292 * [InternetAddress.LOOPBACK_IP_V4] or | |
| 293 * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming | |
| 294 * connection from the network use either one of the values | |
| 295 * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to | |
| 296 * bind to all interfaces or the IP address of a specific interface. | |
| 297 * | |
| 298 * If an IP version 6 (IPv6) address is used, both IP version 6 | |
| 299 * (IPv6) and version 4 (IPv4) connections will be accepted. To | |
| 300 * restrict this to version 6 (IPv6) only, use [v6Only] to set | |
| 301 * version 6 only. | |
| 302 * | |
| 303 * If [port] has the value [:0:] an ephemeral port will be chosen by | |
| 304 * the system. The actual port used can be retrieved using the | |
| 305 * [port] getter. | |
| 306 * | |
| 307 * The optional argument [backlog] can be used to specify the listen | |
| 308 * backlog for the underlying OS listen setup. If [backlog] has the | |
| 309 * value of [:0:] (the default) a reasonable value will be chosen by | |
| 310 * the system. | |
| 311 * | |
| 312 * The optional argument [shared] specifies whether additional ServerSocket | |
| 313 * objects can bind to the same combination of `address`, `port` and `v6Only`. | |
| 314 * If `shared` is `true` and more `ServerSocket`s from this isolate or other | |
| 315 * isolates are bound to the port, then the incoming connections will be | |
| 316 * distributed among all the bound `ServerSocket`s. Connections can be | |
| 317 * distributed over multiple isolates this way. | |
| 318 */ | |
| 319 external static Future<ServerSocket> bind(address, | |
| 320 int port, | |
| 321 {int backlog: 0, | |
| 322 bool v6Only: false, | |
| 323 bool shared: false}); | |
| 324 | |
| 325 /** | |
| 326 * Returns the port used by this socket. | |
| 327 */ | |
| 328 int get port; | |
| 329 | |
| 330 /** | |
| 331 * Returns the address used by this socket. | |
| 332 */ | |
| 333 InternetAddress get address; | |
| 334 | |
| 335 /** | |
| 336 * Closes the socket. The returned future completes when the socket | |
| 337 * is fully closed and is no longer bound. | |
| 338 */ | |
| 339 Future<ServerSocket> close(); | |
| 340 } | |
| 341 | |
| 342 | |
| 343 /** | |
| 344 * The [SocketDirection] is used as a parameter to [Socket.close] and | |
| 345 * [RawSocket.close] to close a socket in the specified direction(s). | |
| 346 */ | |
| 347 class SocketDirection { | |
| 348 static const SocketDirection RECEIVE = const SocketDirection._(0); | |
| 349 static const SocketDirection SEND = const SocketDirection._(1); | |
| 350 static const SocketDirection BOTH = const SocketDirection._(2); | |
| 351 final _value; | |
| 352 | |
| 353 const SocketDirection._(this._value); | |
| 354 } | |
| 355 | |
| 356 /** | |
| 357 * The [SocketOption] is used as a parameter to [Socket.setOption] and | |
| 358 * [RawSocket.setOption] to set customize the behaviour of the underlying | |
| 359 * socket. | |
| 360 */ | |
| 361 class SocketOption { | |
| 362 /** | |
| 363 * Enable or disable no-delay on the socket. If TCP_NODELAY is enabled, the | |
| 364 * socket will not buffer data internally, but instead write each data chunk | |
| 365 * as an invidual TCP packet. | |
| 366 * | |
| 367 * TCP_NODELAY is disabled by default. | |
| 368 */ | |
| 369 static const SocketOption TCP_NODELAY = const SocketOption._(0); | |
| 370 | |
| 371 static const SocketOption _IP_MULTICAST_LOOP = const SocketOption._(1); | |
| 372 static const SocketOption _IP_MULTICAST_HOPS = const SocketOption._(2); | |
| 373 static const SocketOption _IP_MULTICAST_IF = const SocketOption._(3); | |
| 374 static const SocketOption _IP_BROADCAST = const SocketOption._(4); | |
| 375 final _value; | |
| 376 | |
| 377 const SocketOption._(this._value); | |
| 378 } | |
| 379 | |
| 380 /** | |
| 381 * Events for the [RawSocket]. | |
| 382 */ | |
| 383 class RawSocketEvent { | |
| 384 static const RawSocketEvent READ = const RawSocketEvent._(0); | |
| 385 static const RawSocketEvent WRITE = const RawSocketEvent._(1); | |
| 386 static const RawSocketEvent READ_CLOSED = const RawSocketEvent._(2); | |
| 387 static const RawSocketEvent CLOSED = const RawSocketEvent._(3); | |
| 388 final int _value; | |
| 389 | |
| 390 const RawSocketEvent._(this._value); | |
| 391 String toString() { | |
| 392 return const ['RawSocketEvent:READ', | |
| 393 'RawSocketEvent:WRITE', | |
| 394 'RawSocketEvent:READ_CLOSED', | |
| 395 'RawSocketEvent:CLOSED'][_value]; | |
| 396 } | |
| 397 } | |
| 398 | |
| 399 /** | |
| 400 * The [RawSocket] is a low-level interface to a socket, exposing the raw | |
| 401 * events signaled by the system. It's a [Stream] of [RawSocketEvent]s. | |
| 402 */ | |
| 403 abstract class RawSocket implements Stream<RawSocketEvent> { | |
| 404 /** | |
| 405 * Set or get, if the [RawSocket] should listen for [RawSocketEvent.READ] | |
| 406 * events. Default is [:true:]. | |
| 407 */ | |
| 408 bool readEventsEnabled; | |
| 409 | |
| 410 /** | |
| 411 * Set or get, if the [RawSocket] should listen for [RawSocketEvent.WRITE] | |
| 412 * events. Default is [:true:]. | |
| 413 * This is a one-shot listener, and writeEventsEnabled must be set | |
| 414 * to true again to receive another write event. | |
| 415 */ | |
| 416 bool writeEventsEnabled; | |
| 417 | |
| 418 /** | |
| 419 * Creates a new socket connection to the host and port and returns a [Future] | |
| 420 * that will complete with either a [RawSocket] once connected or an error | |
| 421 * if the host-lookup or connection failed. | |
| 422 * | |
| 423 * [host] can either be a [String] or an [InternetAddress]. If [host] is a | |
| 424 * [String], [connect] will perform a [InternetAddress.lookup] and try | |
| 425 * all returned [InternetAddress]es, until connected. Unless a | |
| 426 * connection was established, the error from the first failing connection is | |
| 427 * returned. | |
| 428 * | |
| 429 * The argument [sourceAddress] can be used to specify the local | |
| 430 * address to bind when making the connection. `sourceAddress` can either | |
| 431 * be a `String` or an `InternetAddress`. If a `String` is passed it must | |
| 432 * hold a numeric IP address. | |
| 433 */ | |
| 434 external static Future<RawSocket> connect(host, int port, {sourceAddress}); | |
| 435 | |
| 436 /** | |
| 437 * Returns the number of received and non-read bytes in the socket that | |
| 438 * can be read. | |
| 439 */ | |
| 440 int available(); | |
| 441 | |
| 442 /** | |
| 443 * Read up to [len] bytes from the socket. This function is | |
| 444 * non-blocking and will only return data if data is available. The | |
| 445 * number of bytes read can be less then [len] if fewer bytes are | |
| 446 * available for immediate reading. If no data is available [:null:] | |
| 447 * is returned. | |
| 448 */ | |
| 449 List<int> read([int len]); | |
| 450 | |
| 451 /** | |
| 452 * Writes up to [count] bytes of the buffer from [offset] buffer offset to | |
| 453 * the socket. The number of successfully written bytes is returned. This | |
| 454 * function is non-blocking and will only write data if buffer space is | |
| 455 * available in the socket. | |
| 456 * | |
| 457 * The default value for [offset] is 0, and the default value for [count] is | |
| 458 * [:buffer.length - offset:]. | |
| 459 */ | |
| 460 int write(List<int> buffer, [int offset, int count]); | |
| 461 | |
| 462 /** | |
| 463 * Returns the port used by this socket. | |
| 464 */ | |
| 465 int get port; | |
| 466 | |
| 467 /** | |
| 468 * Returns the remote port connected to by this socket. | |
| 469 */ | |
| 470 int get remotePort; | |
| 471 | |
| 472 /** | |
| 473 * Returns the [InternetAddress] used to connect this socket. | |
| 474 */ | |
| 475 InternetAddress get address; | |
| 476 | |
| 477 /** | |
| 478 * Returns the remote [InternetAddress] connected to by this socket. | |
| 479 */ | |
| 480 InternetAddress get remoteAddress; | |
| 481 | |
| 482 /** | |
| 483 * Closes the socket. Returns a Future that completes with [this] when the | |
| 484 * underlying connection is completely destroyed. | |
| 485 * | |
| 486 * Calling [close] will never throw an exception | |
| 487 * and calling it several times is supported. Calling [close] can result in | |
| 488 * a [RawSocketEvent.READ_CLOSED] event. | |
| 489 */ | |
| 490 Future<RawSocket> close(); | |
| 491 | |
| 492 /** | |
| 493 * Shutdown the socket in the [direction]. Calling [shutdown] will never | |
| 494 * throw an exception and calling it several times is supported. Calling | |
| 495 * shutdown with either [SocketDirection.BOTH] or [SocketDirection.RECEIVE] | |
| 496 * can result in a [RawSocketEvent.READ_CLOSED] event. | |
| 497 */ | |
| 498 void shutdown(SocketDirection direction); | |
| 499 | |
| 500 /** | |
| 501 * Use [setOption] to customize the [RawSocket]. See [SocketOption] for | |
| 502 * available options. | |
| 503 * | |
| 504 * Returns [:true:] if the option was set successfully, false otherwise. | |
| 505 */ | |
| 506 bool setOption(SocketOption option, bool enabled); | |
| 507 } | |
| 508 | |
| 509 /** | |
| 510 * A high-level class for communicating over a TCP socket. | |
| 511 * | |
| 512 * The [Socket] exposes both a [Stream] and a [IOSink] interface, making it | |
| 513 * ideal for using together with other [Stream]s. | |
| 514 */ | |
| 515 abstract class Socket implements Stream<List<int>>, IOSink { | |
| 516 /** | |
| 517 * Creates a new socket connection to the host and port and returns a [Future] | |
| 518 * that will complete with either a [Socket] once connected or an error | |
| 519 * if the host-lookup or connection failed. | |
| 520 * | |
| 521 * [host] can either be a [String] or an [InternetAddress]. If [host] is a | |
| 522 * [String], [connect] will perform a [InternetAddress.lookup] and try | |
| 523 * all returned [InternetAddress]es, until connected. Unless a | |
| 524 * connection was established, the error from the first failing connection is | |
| 525 * returned. | |
| 526 * | |
| 527 * The argument [sourceAddress] can be used to specify the local | |
| 528 * address to bind when making the connection. `sourceAddress` can either | |
| 529 * be a `String` or an `InternetAddress`. If a `String` is passed it must | |
| 530 * hold a numeric IP address. | |
| 531 */ | |
| 532 external static Future<Socket> connect(host, int port, {sourceAddress}); | |
| 533 | |
| 534 /** | |
| 535 * Destroy the socket in both directions. Calling [destroy] will make the | |
| 536 * send a close event on the stream and will no longer react on data being | |
| 537 * piped to it. | |
| 538 * | |
| 539 * Call [close](inherited from [IOSink]) to only close the [Socket] | |
| 540 * for sending data. | |
| 541 */ | |
| 542 void destroy(); | |
| 543 | |
| 544 /** | |
| 545 * Use [setOption] to customize the [RawSocket]. See [SocketOption] for | |
| 546 * available options. | |
| 547 * | |
| 548 * Returns [:true:] if the option was set successfully, false otherwise. | |
| 549 */ | |
| 550 bool setOption(SocketOption option, bool enabled); | |
| 551 | |
| 552 /** | |
| 553 * Returns the port used by this socket. | |
| 554 */ | |
| 555 int get port; | |
| 556 | |
| 557 /** | |
| 558 * Returns the remote port connected to by this socket. | |
| 559 */ | |
| 560 int get remotePort; | |
| 561 | |
| 562 /** | |
| 563 * Returns the [InternetAddress] used to connect this socket. | |
| 564 */ | |
| 565 InternetAddress get address; | |
| 566 | |
| 567 /** | |
| 568 * Returns the remote [InternetAddress] connected to by this socket. | |
| 569 */ | |
| 570 InternetAddress get remoteAddress; | |
| 571 } | |
| 572 | |
| 573 | |
| 574 /** | |
| 575 * Datagram package. Data send to and received from datagram sockets | |
| 576 * contains the internet address and port of the destination or source | |
| 577 * togeter with the data. | |
| 578 */ | |
| 579 class Datagram { | |
| 580 List<int> data; | |
| 581 InternetAddress address; | |
| 582 int port; | |
| 583 | |
| 584 Datagram(this.data, this.address, this.port); | |
| 585 } | |
| 586 | |
| 587 | |
| 588 /** | |
| 589 * The [RawDatagramSocket] is a low-level interface to an UDP socket, | |
| 590 * exposing the raw events signaled by the system. It's a [Stream] of | |
| 591 * [RawSocketEvent]s. | |
| 592 * | |
| 593 * Note that the event [RawSocketEvent.READ_CLOSED] will never be | |
| 594 * received as an UDP socket cannot be closed by a remote peer. | |
| 595 */ | |
| 596 abstract class RawDatagramSocket extends Stream<RawSocketEvent> { | |
| 597 /** | |
| 598 * Set or get, if the [RawDatagramSocket] should listen for | |
| 599 * [RawSocketEvent.READ] events. Default is [:true:]. | |
| 600 */ | |
| 601 bool readEventsEnabled; | |
| 602 | |
| 603 /** | |
| 604 * Set or get, if the [RawDatagramSocket] should listen for | |
| 605 * [RawSocketEvent.WRITE] events. Default is [:true:]. This is a | |
| 606 * one-shot listener, and writeEventsEnabled must be set to true | |
| 607 * again to receive another write event. | |
| 608 */ | |
| 609 bool writeEventsEnabled; | |
| 610 | |
| 611 /** | |
| 612 * Set or get, whether multicast traffic is looped back to the host. | |
| 613 * | |
| 614 * By default multicast loopback is enabled. | |
| 615 */ | |
| 616 bool multicastLoopback; | |
| 617 | |
| 618 /** | |
| 619 * Set or get, the maximum network hops for multicast packages | |
| 620 * originating from this socket. | |
| 621 * | |
| 622 * For IPv4 this is referred to as TTL (time to live). | |
| 623 * | |
| 624 * By default this value is 1 causing multicast traffic to stay on | |
| 625 * the local network. | |
| 626 */ | |
| 627 int multicastHops; | |
| 628 | |
| 629 /** | |
| 630 * Set or get, the network interface used for outgoing multicast packages. | |
| 631 * | |
| 632 * A value of `null`indicate that the system chooses the network | |
| 633 * interface to use. | |
| 634 * | |
| 635 * By default this value is `null` | |
| 636 */ | |
| 637 NetworkInterface multicastInterface; | |
| 638 | |
| 639 /** | |
| 640 * Set or get, whether IPv4 broadcast is enabled. | |
| 641 * | |
| 642 * IPv4 broadcast needs to be enabled by the sender for sending IPv4 | |
| 643 * broadcast packages. By default IPv4 broadcast is disabled. | |
| 644 * | |
| 645 * For IPv6 there is no general broadcast mechanism. Use multicast | |
| 646 * instead. | |
| 647 */ | |
| 648 bool broadcastEnabled; | |
| 649 | |
| 650 /** | |
| 651 * Creates a new raw datagram socket binding it to an address and | |
| 652 * port. | |
| 653 */ | |
| 654 external static Future<RawDatagramSocket> bind( | |
| 655 host, int port, {bool reuseAddress: true}); | |
| 656 | |
| 657 /** | |
| 658 * Returns the port used by this socket. | |
| 659 */ | |
| 660 int get port; | |
| 661 | |
| 662 /** | |
| 663 * Returns the address used by this socket. | |
| 664 */ | |
| 665 InternetAddress get address; | |
| 666 | |
| 667 /** | |
| 668 * Close the datagram socket. | |
| 669 */ | |
| 670 void close(); | |
| 671 | |
| 672 /** | |
| 673 * Send a datagram. | |
| 674 * | |
| 675 * Returns the number of bytes written. This will always be either | |
| 676 * the size of [buffer] or `0`. | |
| 677 */ | |
| 678 int send(List<int> buffer, InternetAddress address, int port); | |
| 679 | |
| 680 /** | |
| 681 * Receive a datagram. If there are no datagrams available `null` is | |
| 682 * returned. | |
| 683 * | |
| 684 * The maximum length of the datagram that can be received is 65503 bytes. | |
| 685 */ | |
| 686 Datagram receive(); | |
| 687 | |
| 688 /** | |
| 689 * Join a multicast group. | |
| 690 * | |
| 691 * If an error occur when trying to join the multicast group an | |
| 692 * exception is thrown. | |
| 693 */ | |
| 694 void joinMulticast(InternetAddress group, {NetworkInterface interface}); | |
| 695 | |
| 696 /** | |
| 697 * Leave a multicast group. | |
| 698 * | |
| 699 * If an error occur when trying to join the multicase group an | |
| 700 * exception is thrown. | |
| 701 */ | |
| 702 void leaveMulticast(InternetAddress group, {NetworkInterface interface}); | |
| 703 } | |
| 704 | |
| 705 | |
| 706 class SocketException implements IOException { | |
| 707 final String message; | |
| 708 final OSError osError; | |
| 709 final InternetAddress address; | |
| 710 final int port; | |
| 711 | |
| 712 const SocketException(this.message, {this.osError, this.address, this.port}); | |
| 713 const SocketException.closed() | |
| 714 : message = 'Socket has been closed', | |
| 715 osError = null, | |
| 716 address = null, | |
| 717 port = null; | |
| 718 | |
| 719 String toString() { | |
| 720 StringBuffer sb = new StringBuffer(); | |
| 721 sb.write("SocketException"); | |
| 722 if (!message.isEmpty) { | |
| 723 sb.write(": $message"); | |
| 724 if (osError != null) { | |
| 725 sb.write(" ($osError)"); | |
| 726 } | |
| 727 } else if (osError != null) { | |
| 728 sb.write(": $osError"); | |
| 729 } | |
| 730 if (address != null) { | |
| 731 sb.write(", address = ${address.host}"); | |
| 732 } | |
| 733 if (port != null) { | |
| 734 sb.write(", port = $port"); | |
| 735 } | |
| 736 return sb.toString(); | |
| 737 } | |
| 738 } | |
| OLD | NEW |