コード例 #1
0
        /// <exception cref="System.IO.IOException"></exception>
        public virtual void Connect(ManagedHttpClientConnection conn, HttpHost host, IPEndPoint
                                    localAddress, int connectTimeout, SocketConfig socketConfig, HttpContext context
                                    )
        {
            Lookup <ConnectionSocketFactory> registry = GetSocketFactoryRegistry(context);
            ConnectionSocketFactory          sf       = registry.Lookup(host.GetSchemeName());

            if (sf == null)
            {
                throw new UnsupportedSchemeException(host.GetSchemeName() + " protocol is not supported"
                                                     );
            }
            IPAddress[] addresses = this.dnsResolver.Resolve(host.GetHostName());
            int         port      = this.schemePortResolver.Resolve(host);

            for (int i = 0; i < addresses.Length; i++)
            {
                IPAddress address = addresses[i];
                bool      last    = i == addresses.Length - 1;
                System.Net.Sockets.Socket sock = sf.CreateSocket(context);
                sock.SetReuseAddress(socketConfig.IsSoReuseAddress());
                conn.Bind(sock);
                IPEndPoint remoteAddress = new IPEndPoint(address, port);
                if (this.log.IsDebugEnabled())
                {
                    this.log.Debug("Connecting to " + remoteAddress);
                }
                try
                {
                    sock.ReceiveTimeout = socketConfig.GetSoTimeout();
                    sock = sf.ConnectSocket(connectTimeout, sock, host, remoteAddress, localAddress,
                                            context);
                    sock.NoDelay = socketConfig.IsTcpNoDelay();
                    sock.SetKeepAlive(socketConfig.IsSoKeepAlive());
                    int linger = socketConfig.GetSoLinger();
                    if (linger >= 0)
                    {
                        sock.SetSoLinger(linger > 0, linger);
                    }
                    conn.Bind(sock);
                    return;
                }
                catch (SocketTimeoutException ex)
                {
                    if (last)
                    {
                        throw new ConnectTimeoutException(ex, host, addresses);
                    }
                }
                catch (ConnectException ex)
                {
                    if (last)
                    {
                        string msg = ex.Message;
                        if ("Connection timed out".Equals(msg))
                        {
                            throw new ConnectTimeoutException(ex, host, addresses);
                        }
                        else
                        {
                            throw new HttpHostConnectException(ex, host, addresses);
                        }
                    }
                }
                if (this.log.IsDebugEnabled())
                {
                    this.log.Debug("Connect to " + remoteAddress + " timed out. " + "Connection will be retried using another IP address"
                                   );
                }
            }
        }