Boost ASIO: Connection Refused

Viewed 42

I am receiving the following error:

terminate called after throwing an instance of 'boost::exception_detail::clone_implboost::exception_detail::error_info_injector<boost::system::system_error >' what(): connect: Connection refused Aborted (core dumped)

I am trying to connect on two different machines on the same network; this works if I use local host. Any suggestions on how to resolve ?

Client:

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

using namespace boost::asio;
using ip::tcp;
using std::string;
using std::cout;
using std::endl;

int main() {
     boost::asio::io_service io_service;

     tcp::socket socket(io_service);

 socket.connect( tcp::endpoint( boost::asio::ip::address::from_string("192.158.112.3"), 1234 ));

 const string msg = "Hello from Client!\n";
 boost::system::error_code error;
 boost::asio::write( socket, boost::asio::buffer(msg), error );
 if( !error ) {
    cout << "Client sent hello message!" << endl;
 }
 else {
    cout << "send failed: " << error.message() << endl;
 }
 
       boost::asio::streambuf receive_buffer;
       boost::asio::read(socket, receive_buffer, boost::asio::transfer_all(), error);
      if( error && error != boost::asio::error::eof ) {
       cout << "receive failed: " << error.message() << endl;
    }
    else {
    const char* data = boost::asio::buffer_cast<const char*>(receive_buffer.data());
    cout << data << endl;
   }
return 0;
}

Server:

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

using namespace boost::asio;
using ip::tcp;
using std::string;
using std::cout;
using std::endl;

   string read_(tcp::socket & socket) {
    boost::asio::streambuf buf;
    boost::asio::read_until( socket, buf, "\n" );
    string data = boost::asio::buffer_cast<const char*>(buf.data());
    return data;
 }  
   void send_(tcp::socket & socket, const string& message) {
        const string msg = message + "\n";
        boost::asio::write( socket, boost::asio::buffer(message) );
 }

 int main() {
      boost::asio::io_service io_service;
  tcp::acceptor acceptor_(io_service, tcp::endpoint(tcp::v4(), 1234 ));
  tcp::socket socket_(io_service);
  acceptor_.accept(socket_);
  string message = read_(socket_);
  cout << message << endl;
  send_(socket_, "Hello From Server!");
  cout << "Servent sent Hello message to Client!" << endl;
   return 0;
 }
1 Answers

Like others have mentioned, your serer only accepts 1 connection, then exits.

Other than that the only reasonable explanations are:

  • the hard-coded IP address is wrong
  • the acceptor is not binding to the interface with that address (firewalls may be involved).

Here's a simplified take on client and server, which accepts multiple connections and shows that things are working with a live demo (my ip address is different, obviously):

  • File server.cpp

     #include <boost/asio.hpp>
     #include <iomanip>
     #include <iostream>
    
     namespace asio = boost::asio;
     using asio::ip::tcp;
     using namespace std::string_view_literals;
    
     std::string read_string(tcp::socket & socket) {
         std::string s;
         auto n = read_until(socket, asio::dynamic_buffer(s), "\n");
         return s.substr(0, n); // CAUTION: discarding any remaining buffer!
     }
    
     void send_(tcp::socket& socket, const std::string& message) {
         write(socket, std::array{asio::buffer(message), asio::buffer("\n"sv)});
     }
    
     int main() {
         asio::io_service io_service;
         tcp::acceptor    acceptor(io_service, {{}, 1234});
    
         while (true) {
             tcp::socket c = acceptor.accept();
             std::cout << std::quoted(read_string(c)) << std::endl;
             send_(c, "Hello From Server!");
             c.close();
         }
     }
    
  • File client.cpp

     #include <boost/asio.hpp>
     #include <iostream>
    
     namespace asio = boost::asio;
     using asio::ip::tcp;
    
     int main() {
         asio::io_service io_service;
    
         tcp::socket socket(io_service);
    
         socket.connect(tcp::endpoint(
             boost::asio::ip::address::from_string("192.168.50.225"), 1234));
    
         const std::string msg = "Hello from Client!\n";
    
         boost::system::error_code error;
         write(socket, asio::buffer(msg), error);
         std::cout << "send: " << error.message() << std::endl;
    
         asio::streambuf receive_buffer;
         read(socket, receive_buffer /*, asio::transfer_all()*/, error);
    
         std::cout << "receive (" << error.message() << "): " << &receive_buffer
                   << std::endl;
     }
    

Note the simplifications around buffering and error handling. Also note the CAUTION comment.

Demo:

enter image description here

Related