You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C/C++访问CnosDB?是否提供官方C/C++客户端?

使用C/C++访问CnosDB数据库的方法

一、官方客户端支持情况

CnosDB目前没有官方提供的C/C++专属客户端,但可以通过两种主流兼容方式实现数据库访问。

二、访问方式及实现示例

1. 通过HTTP API直接访问

CnosDB兼容InfluxDB的Line Protocol与HTTP API,可直接用C/C++的HTTP客户端库(如libcurl)发送请求,完成数据写入、查询等操作。

数据写入示例(C语言 + libcurl)

#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    
    if(curl) {
        // 替换为你的CnosDB集群地址、端口及目标数据库
        curl_easy_setopt(curl, CURLOPT_URL, "http://your_cnosdb_host:8902/api/v1/write?db=your_database");
        
        // 若开启认证,替换为实际用户名和密码
        curl_easy_setopt(curl, CURLOPT_USERPWD, "username:password");
        
        // 构造Line Protocol格式的写入数据
        const char *post_data = "temperature,location=room1 value=25.6 1680000000000000000";
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);
        
        // 执行写入请求
        res = curl_easy_perform(curl);
        if(res != CURLE_OK)
            fprintf(stderr, "写入失败: %s\n", curl_easy_strerror(res));
        
        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    return 0;
}

编译命令:gcc write.c -o write -lcurl

数据查询示例(C语言 + libcurl)

#include <stdio.h>
#include <curl/curl.h>
#include <string.h>

size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t realsize = size * nmemb;
    strcat((char*)userp, (char*)contents);
    return realsize;
}

int main(void) {
    CURL *curl;
    CURLcode res;
    char response[1024] = {0};

    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    
    if(curl) {
        // 替换为你的CnosDB地址、数据库及查询语句
        curl_easy_setopt(curl, CURLOPT_URL, "http://your_cnosdb_host:8902/api/v1/query?db=your_database&q=SELECT * FROM temperature WHERE location='room1'");
        
        // 若开启认证,替换为实际用户名和密码
        curl_easy_setopt(curl, CURLOPT_USERPWD, "username:password");
        
        // 设置回调函数接收查询响应
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);
        
        // 执行查询请求
        res = curl_easy_perform(curl);
        if(res != CURLE_OK)
            fprintf(stderr, "查询失败: %s\n", curl_easy_strerror(res));
        else
            printf("查询结果:\n%s\n", response);
        
        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    return 0;
}

编译命令:gcc query.c -o query -lcurl

2. 复用InfluxDB的C/C++客户端库

由于CnosDB兼容InfluxDB协议,可直接使用成熟的InfluxDB C/C++客户端库(如influxdb-cxx),仅需将连接地址替换为CnosDB的地址即可。

示例(C++ + influxdb-cxx)

先安装influxdb-cxx库,再编写代码:

#include <influxdb/influxdb.hpp>
#include <iostream>

int main() {
    // 初始化客户端,替换为你的CnosDB地址、数据库名及认证信息
    auto db = influxdb::InfluxDBFactory::Get("http://username:password@your_cnosdb_host:8902/your_database");
    
    // 写入数据
    db->write(influxdb::Point{"temperature"}
        .addTag("location", "room1")
        .addField("value", 25.6)
        .setTimestamp(std::chrono::system_clock::now()));
    
    // 查询并打印数据
    auto points = db->query("SELECT * FROM temperature WHERE location = 'room1'");
    for (const auto& point : points) {
        std::cout << "标签: " << point.getTags() << " 字段: " << point.getFields() << std::endl;
    }
    
    return 0;
}

编译命令需根据库的安装方式调整,确保链接对应的依赖库。

三、关键注意事项

  • 确保CnosDB的HTTP端口(默认8902)对外开放,客户端与集群网络可达。
  • 若集群开启认证,所有请求必须携带正确的用户名和密码。
  • Line Protocol格式需严格符合规范,否则会导致数据写入失败。

内容的提问来源于stack exchange,提问作者xufei Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:23:12