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 |