【问题标题】:Create pointer to boost asio tcp socket创建指针以提升 asio tcp 套接字
【发布时间】:2017-09-28 09:03:07
【问题描述】:

我想要做什么

我正在开发一个通过 TCP 连接到硬件的库。该库提供了一些用于在远程硬件上设置参数的函数。为了使这个库易于使用,我希望 connect 函数创建一个连接状态 struct / 对象,该指针将由使用此类的软件调用保存。这样,它可以一次连接到多个目标,并让每个连接的句柄传递给库的其他函数。

以下是相关源码:

#include <boost/array.hpp>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;

struct connection_state {
    boost::asio::io_service *io_service;
    tcp::socket *socket;
    bool connected = false;
};

__stdcall int connect(void **state, const char *host, int port) {
    // create connection state object
    struct connection_state *s = (connection_state *)calloc(1, sizeof(struct connection_state));
    if (!s) {
        // we did not get the memory
        return -ENOMEM;
    }
    // bend the state pointer to point to our new object
    *state = (void *)s;
    // create ioservice object and put it in state
    s->io_service = new boost::asio::io_service();
    // create socket and put it in state
    s->socket = new tcp::socket(s->io_service); // THIS LINE FAILS
    // create resolver on stack
    tcp::resolver resolver(s->io_service);
    // create query
    tcp::resolver::query query(host, std::to_string(port));
    tcp::resolver::iterator itt;
    // resolve IP / hostname
    itt = resolver.resolve(query);
    // connect!
    boost::asio::connect(s->socket, itt);
    // we are now connected!
    s->connected = true;
    return 0;
}

此代码基于 boost 文档中的 example TCP client,但我试图将 socketio_service 对象以我可以传递的某种形式传递。

我的问题

这无法构建:

pc/PC.cpp: In function ‘int connect(void**, const char*, int)’: 
pc/PC.cpp:67:44: error: no matching function for call to 
‘boost::asio::basic_stream_socket<boost::asio::ip::tcp>::basic_stream_socket(boost::asio::io_service*&)’
 s->socket = new tcp::socket(s->io_service); // THIS LINE FAILS
                                          ^

我真的不知道为什么我不能以这种方式创建一个新的tcp::socket

【问题讨论】:

    标签: c++ sockets pointers boost tcp


    【解决方案1】:

    ‘boost::asio::basic_stream_socket::basic_stream_socket(boost::asio::io_service*&)’

    它表示您将 io_service 作为指针传递。别。

    s->socket = new tcp::socket(*(s->io_service));
    

    更好的是,不要在 c++ 中使用 newdelete¹

    (¹ 更糟,malloc/free

    【讨论】:

    • 对,取消引用修复了它。至于new / malloc / calloc,创建一个我不知道的生命周期的对象的好方法是什么?我可以将所有这些移到一个类中,但我仍然需要使用 new 创建它的一个实例并在断开连接函数中删除它。
    • 嗯,C++ 不像 C。这里是 what I'd do in C++。您可以“pimpl”拆分该实现:wandbox.org/permlink/rAf5rbkfoYIdJDXl
    • 你当然可以让字体完全透明("C" 样式,但是会丢失 RAII)
    • 看起来不错,但问题是,该函数是一个库的接口,将从 C 中调用(以及其他),因此我无法真正导出该 connction_handle 类型。这就是为什么我将其设为 void,以便调用函数不必知道实际类型。
    • 当然,您不必为 void 做到这一点:wandbox.org/permlink/ZcuYThuvDhsEHQqF(查看connection.h 那里)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多