jeudi 18 août 2016

Standalone ASIO Asynchronous Not Connecting

ASIO seems like the best async cross-platform networking library for my project. However, I'm having trouble getting it to actually connect.

First off, I'm not using Boost. I'm compiling this on Windows for the time being, so I had to manually add definitions to inform ASIO that I'm using a C++11-compliant compiler.

Source.cpp

#define TCPCLIENT_DEBUG
#include "TCPClient.hpp"
#include <iostream>

#define PORT "1234"
#define HOST "127.0.0.1"

int main() {
    DEBUG("Starting program...\n");
    namespace ip = asio::ip;

    asio::io_service io;
    ip::tcp::resolver::query query(HOST, PORT);
    ip::tcp::resolver resolver(io);
    decltype(resolver)::iterator ep_iter = resolver.resolve(query);

    TCPClient client(io, ep_iter);

    try {
        std::cin.get();
    }
    catch (const std::exception &e) { // mainly to catch Ctrl+C
        std::cout << e.what() << std::endl;
    }
    return 0;
}

TCPClient.hpp

#ifndef TCPCLIENT_HPP
#define TCPCLIENT_HPP

#include <functional>

#if defined(_DEBUG) || defined(TCPCLIENT_DEBUG)
#include <iostream>
#define DEBUG(dbg_msg) std::cerr << dbg_msg
#else
#define DEBUG(dbg_msg)
#endif

#define ASIO_STANDALONE
#define ASIO_HAS_CSTDINT
#define ASIO_HAS_STD_ARRAY
#define ASIO_HAS_STD_ADDRESSOF
#define ASIO_HAS_STD_SHARED_PTR
#define ASIO_HAS_STD_TYPE_TRAITS

#include <asio.hpp>
#ifndef BUFFER_SIZE
#define BUFFER_SIZE 1024
#endif

class TCPClient {
public:
    TCPClient(asio::io_service& io, asio::ip::tcp::resolver::iterator endpoint_iter);
    void on_connect(const asio::error_code& err);

private:
    asio::io_service& m_io;                         // store the io service reference
    asio::ip::tcp::socket m_sock;                   // object's socket
    static const size_t bufSize{ BUFFER_SIZE };     // default buffer size
    char m_buffer[bufSize];                         // store the received data in a buffer
};

#endif//TCPCLIENT_HPP

TCPClient.cpp

#include "TCPClient.hpp"

TCPClient::TCPClient(asio::io_service& io, asio::ip::tcp::resolver::iterator endpoint_iter) : m_io{ io }, m_sock(io) {
    asio::ip::tcp::endpoint endpoint = *endpoint_iter;
    asio::error_code ec;

    m_sock.async_connect(
        endpoint,
        std::bind(
            &TCPClient::on_connect,
            this,
            std::placeholders::_1
        )
    );
}

void TCPClient::on_connect(const asio::error_code& err) {
    DEBUG("Connected successfully!\n");
}

It seems to me that the on_connect is never being called. It only prints "Starting program...".

Using netcat, I can spawn a listener that sees the connection successfully go through.

enter image description here

What is obviously wrong with my code? I'm only working on the connection function for right now.

Aucun commentaire:

Enregistrer un commentaire