| Index: sdk/lib/io/sync_socket.dart | 
| diff --git a/sdk/lib/io/sync_socket.dart b/sdk/lib/io/sync_socket.dart | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..cc055a7f9d6be171d01663dca61646e2d80f83a1 | 
| --- /dev/null | 
| +++ b/sdk/lib/io/sync_socket.dart | 
| @@ -0,0 +1,108 @@ | 
| +// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file | 
| +// for details. All rights reserved. Use of this source code is governed by a | 
| +// BSD-style license that can be found in the LICENSE file. | 
| + | 
| +part of dart.io; | 
| + | 
| +/** | 
| + * A low-level class for communicating synchronously over a TCP socket. | 
| + * | 
| + * Warning: [RawSynchronousSocket] should probably only be used to connect to | 
| + * 'localhost'. The operations below will block the calling thread to wait for | 
| + * a response from the network. The thread can process no other events while | 
| + * waiting for these operations to complete. [RawSynchronousSocket] is not | 
| + * suitable for applications that require high performance or asynchronous I/O | 
| + * such as a server. Instead such applications should use the non-blocking | 
| + * sockets and asynchronous operations in the Socket or RawSocket classes. | 
| + */ | 
| +abstract class RawSynchronousSocket { | 
| +  /** | 
| +   * Creates a new socket connection and returns a [RawSynchronousSocket]. | 
| +   * | 
| +   * [host] can either be a [String] or an [InternetAddress]. If [host] is a | 
| +   * [String], [connectSync] will perform a [InternetAddress.lookup] and try | 
| +   * all returned [InternetAddress]es, until connected. Unless a | 
| +   * connection was established, the error from the first failing connection is | 
| +   * returned. | 
| +   */ | 
| +  external static RawSynchronousSocket connectSync(host, int port); | 
| + | 
| +  /** | 
| +   * Returns the number of received and unread bytes in the socket that can be | 
| +   * read. | 
| +   */ | 
| +  int available(); | 
| + | 
| +  /** | 
| +   * Closes the [RawSynchronousSocket]. | 
| +   * | 
| +   * Once [closeSync] has been called, attempting to call [readSync], | 
| +   * [readIntoSync], [writeFromSync], [remoteAddress], and [remotePort] will | 
| +   * cause a [SocketException] to be thrown. | 
| +   */ | 
| +  void closeSync(); | 
| + | 
| +  /** | 
| +   * Reads into an existing [List<int>] from the socket into the range: | 
| +   * [[start],[end]). | 
| +   * | 
| +   * Reads into an existing [List<int>] from the socket. If [start] is present, | 
| +   * the bytes will be filled into [buffer] from index [start], otherwise index | 
| +   * 0. If [end] is present, [end] - [start] bytes will be read into [buffer], | 
| +   * otherwise up to [buffer.length]. If [end] == [start], no bytes are read. | 
| +   * Returns the number of bytes read. | 
| +   */ | 
| +  int readIntoSync(List<int> buffer, [int start = 0, int end]); | 
| + | 
| +  /** | 
| +   * Reads up to [bytes] bytes from the socket. | 
| +   * | 
| +   * Blocks and waits for a response of up to a specified number of bytes | 
| +   * sent by the socket. [bytes] specifies the maximum number of bytes to | 
| +   * be read. Returns the list of bytes read, which could be less than the | 
| +   * value specified by [bytes]. | 
| +   */ | 
| +  List<int> readSync(int bytes); | 
| + | 
| +  /** | 
| +   * Shutdown a socket in the provided direction. | 
| +   * | 
| +   * Calling shutdown will never throw an exception and calling it several times | 
| +   * is supported. If both [RECEIVE] and [SEND] directions are closed, the | 
| +   * socket is closed completely, the same as if [closeSync] has been called. | 
| +   */ | 
| +  void shutdown(SocketDirection direction); | 
| + | 
| +  /** | 
| +   * Writes data from a specified range in a [List<int>] to the socket. | 
| +   * | 
| +   * Writes into the socket from a [List<int>]. If [start] is present, the bytes | 
| +   * will be written to the socket starting from index [start]. If [start] is | 
| +   * not present, the bytes will be written starting from index 0. If [end] is | 
| +   * present, the [end] - [start] bytes will be written into the socket starting | 
| +   * at index [start]. If [end] is not provided, [buffer.length] elements will | 
| +   * be written to the socket starting from index [start]. If [end] == [start], | 
| +   * nothing happens. | 
| +   */ | 
| +  void writeFromSync(List<int> buffer, [int start = 0, int end]); | 
| + | 
| +  /** | 
| +   * The port used by this socket. | 
| +   */ | 
| +  int get port; | 
| + | 
| +  /** | 
| +   * The remote port connected to by this socket. | 
| +   */ | 
| +  int get remotePort; | 
| + | 
| +  /** | 
| +   * The [InternetAddress] used to connect this socket. | 
| +   */ | 
| +  InternetAddress get address; | 
| + | 
| +  /** | 
| +   * The remote [InternetAddress] connected to by this socket. | 
| +   */ | 
| +  InternetAddress get remoteAddress; | 
| +} | 
|  |