'Connect to the given host and port.
Asynchronously returns an `.IOStream` (or `.SSLIOStream` if
``ssl_options`` is not None).
Using the ``source_ip`` kwarg, one can specify the source
IP address to use when establishing the connection.
In case the user needs to resolve and
use a specific interface, it has to be handled outside
of Tornado as this depends very much on the platform.
Similarly, when the user requires a certain source port, it can
be specified using the ``source_port`` arg.
.. versionchanged:: 4.5
Added the ``source_ip`` and ``source_port`` arguments.'

@gen.coroutine
def connect(self, host, port, af=socket.AF_UNSPEC, ssl_options=None, max_buffer_size=None, source_ip=None, source_port=None):

    addrinfo = (yield self.resolver.resolve(host, port, af))
    connector = _Connector(addrinfo, self.io_loop, functools.partial(self._create_stream, max_buffer_size, source_ip=source_ip, source_port=source_port))
    (af, addr, stream) = (yield connector.start())
    if (ssl_options is not None):
        stream = (yield stream.start_tls(False, ssl_options=ssl_options, server_hostname=host))
    raise gen.Return(stream)
