Search code examples
boostboost-asio

boost/asio connect, connection refused


I am working with libscapi and keep getting errors when trying to establish a connection with boost::asio::connect. I have been trying to get simple examples to work (like the one below) but I always get the "connection refused" error. I guess it must be a very simple mistake but I just don't understand it.

#include <boost/asio.hpp>
#include <iostream>


int main(int argc, char* argv[]) {

    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::endpoint endpoint;
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query("www.boost.org", "http");
    boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(query);
    boost::asio::ip::tcp::resolver::iterator end; // End marker.

    while (iter != end)
    {
        boost::asio::ip::tcp::endpoint endpoint = *iter++;
            std::cout << endpoint << std::endl;
    }

    boost::asio::ip::tcp::socket socket(io_service);
    socket.connect(endpoint);
}


Solution

  • You are passing default constructed endpoint for connect, which is just not valid. When you have a list of endpoints specified by [iter,end) iterators, you should check each one of them passing it to connect:

    boost::asio::ip::tcp::socket socket(io_service);
    
    while (iter != end)
    {
        boost::asio::ip::tcp::endpoint endpoint = *iter++;
            std::cout << endpoint << std::endl;
        boost::system::erroc_code err;
        socket.connect(endpoint,err);
        if ( !err ) // there is no error
        {
           // connection is established, we can break loop
           break;
        }
        else {
             std::cout << "ups, we have problem" << std::endl;
        }
    }
    

    Simpler version would be to use free connect function which takes both iterators:

    boost::asio::ip::tcp::socket socket(io_service);
    boost::system::error_code err;
    boost::asio::connect(socket,iter,end,err);
    if (!err)
        std::cout << "connected" << std::endl;