码迷,mamicode.com
首页 > 其他好文 > 详细

ab fails to connect to localhost

时间:2018-11-13 12:15:09      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:structure   nec   stream   his   and   w3m   cti   issue   apache   

The following command fails:

$ ab -n 1 localhost:8000/
...
Benchmarking localhost (be patient)...apr_socket_recv: Connection refused (111)

But this one succeeds:

$ ab -n 1 127.0.0.1:8000/

In /etc/hosts I have:

127.0.0.1   localhost.localdomain   localhost
::1     localhost.localdomain   localhost

The issue here is caused by ab taking the first result returned by apr_sockaddr_info_get:

https://github.com/apache/httpd/blob/2.4.29/support/ab.c#L1835-L1837

But apr_sockaddr_info_get returns a list. If it were to try the second sockaddr structure, it would connect. This way it works:


    rv = apr_sockaddr_info_get(&sa, REMOTE_HOST, APR_UNSPEC, REMOTE_PORT, 0, mp);
    if (rv != APR_SUCCESS) {
        return rv;
    }
    
    for ( ; sa; sa = sa->next) {
        rv = apr_socket_create(&s, sa->family, SOCK_STREAM, APR_PROTO_TCP, mp);
        if (rv != APR_SUCCESS) {
            return rv;
        }

        apr_socket_opt_set(s, APR_SO_NONBLOCK, 1);
        apr_socket_timeout_set(s, SOCK_TIMEOUT);

        rv = apr_socket_connect(s, sa);
        if (rv == ECONNREFUSED) {
            continue;
        } else if (rv == APR_SUCCESS) {
            break;
        } else {
            return rv;
        }
    }

    apr_socket_opt_set(s, APR_SO_NONBLOCK, 0);
    apr_socket_timeout_set(s, SOCK_TIMEOUT);


Other tools (like, curl, wget, w3m) deal with it just fine.

P.S. A couple of links just in case

https://gist.github.com/x-yuri/5ad28ac0a22ca19a7c3073ce0de5abf0
https://gist.github.com/x-yuri/95fd4776fb9bf8f1eaae7eb2e7ed6bd4

  

ab fails to connect to localhost

标签:structure   nec   stream   his   and   w3m   cti   issue   apache   

原文地址:https://www.cnblogs.com/jack-Star/p/9951428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!