RabbitMQ C 客户端收发数据实例解析

2023-05-16

rabbitmq-c客户端,github地址:https://github.com/alanxz/rabbitmq-c
rabbitmq-c是一个C语言操作的AMQP客户端库,用来与RabbitMQ broker进行交互

Building and installing:
需要:CMake2.6或以上版本
1、下载安装包后解压,进入主目录,
2、mkdir build && cd build 
3、cmake ..
4、cmake --build . 
完成后,build目录下会出现librabbitmq、examples 和 tests 子目录。其中librabbitmq中包含生成的librabbitmq.so等文件;examples中包含amqp_bind、amqp_consumer、amqp_exchange_declare、amqp_listen、amqp_listenq、amqp_producer、amqp_rpc_sendstring_client、amqp_sendstring 和 amqp_unbind 可执行文件。

运行实例:
在一个terminal中,运行
./examples/amqp_listen localhost 5672 amq.direct test
四个参数分别为域名、端口、exchange、bindingkey

另一个terminal中,运行
./examples/amqp_sendstring localhost 5672 amq.direct test "hello world"
五个参数分别为域名、端口、exchange、bindingkey 发送字符

会在监听的terminal中出现如下打印:
Delivery 1, exchange amq.direct routingkey test
Content-type: text/plain
----
00000000: 68 65 6C 6C 6F 20 77 6F : 72 6C 64                 hello world

0000000B:


附上代码解析:

 amqp_listen.c

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <amqp.h>
#include <amqp_tcp_socket.h>

#include <assert.h>

#include "utils.h"

int main(int argc, char const *const *argv) {
  char const *hostname;
  int port, status;
  char const *exchange;
  char const *bindingkey;
  amqp_socket_t *socket = NULL;
  amqp_connection_state_t conn;

  amqp_bytes_t queuename;

  if (argc < 5) {
    fprintf(stderr, "Usage: amqp_listen host port exchange bindingkey\n");
    return 1;
  }

  hostname = argv[1];
  port = atoi(argv[2]);
  exchange = argv[3];
  bindingkey = argv[4];

  /*分配并初始化一个新的amqp_connection_state_t对象,用该函数创建的
  amqp_connection_state_t对象需要用amqp_destroy_connection()函数来释放*/
  conn = amqp_new_connection();

  /*创建一个新的TCP socket
  需调用amqp_connection_close()释放socket资源*/
  socket = amqp_tcp_socket_new(conn);
  if (!socket) {
    die("creating TCP socket");
  }


/**
 * 打开socket连接
 *
 * 该函数打开从amqp_tcp_socket_new()或amqp_ssl_socket_new()返回的socket连接。
 * 该函数应当在设置socket选择之后并在使用amqp_set_socket()分配socket到AMQP连接
 * 之前调用。
 *
 * 成功返回AMQP_STATUS_OK,失败返回一个amqp_status_enum
 */
  status = amqp_socket_open(socket, hostname, port);
  if (status) {
    die("opening TCP socket");
  }

  /**
 *login到broker
 *
 * 使用amqp_open_socket和amqp_set_sockfd后,调用amqp_login完成到broker的连接
 *
 * \param [in] state 连接对象
 * \param [in] vhost 虚拟主机连接到broker,大多数broker默认为“/”
 * \param [in] channel_max 连接通道数量的限制,0代表无限制,较好的默认值是AMQP_DEFAULT_MAX_CHANNELS
 * \param [in] frame_max 线路上的AMQP帧的最大大小以请求代理进行此连接,最小4096,
 * 最大2^31-1,较好的默认值是131072 (128KB)或者AMQP_DEFAULT_FRAME_SIZE
 * \param [in] heartbeat 心跳帧到broker的请求之间的秒数。设0表示禁用心跳
 * \param [in] sasl_method SASL method用来验证broker,以下是SASL methods的实现:
 *             -AMQP_SASL_METHOD_PLAIN:该方法需要按如下顺序跟两个参数:
 *               const char* username, and const char* password.
 *             -AMQP_SASL_METHOD_EXTERNAL:该方法需要跟参数:
 *               const char* identity.
 *
 * 返回值:amqp_rpc_reply_t 标明成功或失败
 */
  die_on_amqp_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN,
                               "guest", "guest"),
                    "Logging in");


  amqp_channel_open(conn, 1);

  /**
 * 获取最后一个全局amqp_rpc_reply
 *
 * 此API方法对应于大多数同步的AMQP方法返回一个指向解码方法结果的指针。
 *
 * \param [in] state 连接对象
 * \return 最新的amqp_rpc_reply_t
 * - r.reply_type == AMQP_RESPONSE_NORMAL. RPC已成功完成
 * - r.reply_type == AMQP_RESPONSE_SERVER_EXCEPTION. broker返回异常
 * - r.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION. 库内发生异常
 */
  die_on_amqp_error(amqp_get_rpc_reply(conn), "Opening channel");

  {
    amqp_queue_declare_ok_t *r = amqp_queue_declare(
        conn, 1, amqp_empty_bytes, 0, 0, 0, 1, amqp_empty_table);
    die_on_amqp_error(amqp_get_rpc_reply(conn), "Declaring queue");

/**
 * 复制一个amqp_bytes_t缓冲区。
 *
 * clone缓冲区并复制内容
 *
 * 与输出相关的内存分配给amqp_bytes_malloc(),且应该amqp_bytes_free()释放
 */
    queuename = amqp_bytes_malloc_dup(r->queue);
    if (queuename.bytes == NULL) {
      fprintf(stderr, "Out of memory while copying queue name");
      return 1;
    }
  }

  amqp_queue_bind(conn, 1, queuename, amqp_cstring_bytes(exchange),
                  amqp_cstring_bytes(bindingkey), amqp_empty_table);
  die_on_amqp_error(amqp_get_rpc_reply(conn), "Binding queue");

  amqp_basic_consume(conn, 1, queuename, amqp_empty_bytes, 0, 1, 0,
                     amqp_empty_table);
  die_on_amqp_error(amqp_get_rpc_reply(conn), "Consuming");

  {
    for (;;) {
      amqp_rpc_reply_t res;
      amqp_envelope_t envelope;

      /**
      * 释放amqp_connection_state_t占用的内存
      *
      * 释放与任何通道相关的amqp_connection_state_t对象拥有的内存,允许库重用。
      * 在调用该函数之前使用库返回的任何内存,会导致未定义的行为。
      */
      amqp_maybe_release_buffers(conn);

      /**
      * 等待并消费一条消息
      *
      * 在任何频道上等待basic.deliver方法,一旦收到basic.deliver它读取该消息,并返回。
      * 如果在basic.deliver之前接收到任何其他方法,则此函数将返回一个包含
      * ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION和
      * ret.library_error == AMQP_STATUS_UNEXPECTED_STATE的amqp_rpc_reply_t。
      * 然后调用者应该调用amqp_simple_wait_frame()来读取这个帧并采取适当的行动。
      *
      * 在使用amqp_basic_consume()函数启动消费者之后,应该使用此函数
      *
      *  \returns 一个amqp_rpc_reply_t对象,成功时,ret.reply_type == AMQP_RESPONSE_NORMAL
      *  如果ret.reply_type == AMQP_RESPONSE_LIBRARY_EXCEPTION,并且
      *  ret.library_error == AMQP_STATUS_UNEXPECTED_STATE
      *  如果收到AMQP_BASIC_DELIVER_METHOD以外的帧,则调用者应调用amqp_simple_wait_frame()
      *  来读取此帧并采取适当的操作。
      */
      res = amqp_consume_message(conn, &envelope, NULL, 0);

      if (AMQP_RESPONSE_NORMAL != res.reply_type) {
        break;
      }

      printf("Delivery %u, exchange %.*s routingkey %.*s\n",
             (unsigned)envelope.delivery_tag, (int)envelope.exchange.len,
             (char *)envelope.exchange.bytes, (int)envelope.routing_key.len,
             (char *)envelope.routing_key.bytes);

      if (envelope.message.properties._flags & AMQP_BASIC_CONTENT_TYPE_FLAG) {
        printf("Content-type: %.*s\n",
               (int)envelope.message.properties.content_type.len,
               (char *)envelope.message.properties.content_type.bytes);
      }
      printf("----\n");

      amqp_dump(envelope.message.body.bytes, envelope.message.body.len);

      /**
       * 释放在amqp_consume_message()中分配的与amqp_envelope_t相关联的内存
       */
      amqp_destroy_envelope(&envelope);
    }
  }

  /**
 * 关闭 channel
 *
 * \param [in] state 连接对象
 * \param [in] channel channel标识符
 * \param [in] 关闭channel的原因,最好默认为AMQP_REPLY_SUCCESS
 * \return amqp_rpc_reply_t 表示成功或失败
 */
  die_on_amqp_error(amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS),
                    "Closing channel");

  /**
   * 关闭整个连接
   *
   * 隐式关闭所有连接,通知broker连接正在关闭,收到来自broker的确认后,
   * 关闭socket
   *
 * \param [in] state 连接对象
 * \param [in] 关闭channel的原因,最好默认为AMQP_REPLY_SUCCESS
 * \return amqp_rpc_reply_t 表示成功或失败
   */
  die_on_amqp_error(amqp_connection_close(conn, AMQP_REPLY_SUCCESS),
                    "Closing connection");

  /**
 * 销毁amqp_connection_state_t对象
 *
 * 销毁使用amqp_new_connection()创建的amqp_connection_state_t对象
 * 如果与broker的连接处于打开状态,则会以200(成功)的答复代码隐式关闭。
 * 任何会被amqp_maybe_release_buffers()或amqp_maybe_release_buffers_on_channel()
 * 释放的内存都将被释放,并且使用该内存将导致未定义的行为。
 *
 * \return  成功返回AMQP_STATUS_OK. 失败返回amqp_status_enum值 
 */
  die_on_error(amqp_destroy_connection(conn), "Ending connection");

  return 0;
}

amqp_sendstring.c

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <amqp.h>
#include <amqp_tcp_socket.h>

#include "utils.h"

int main(int argc, char const *const *argv) {
  char const *hostname;
  int port, status;
  char const *exchange;
  char const *routingkey;
  char const *messagebody;
  amqp_socket_t *socket = NULL;
  amqp_connection_state_t conn;

  if (argc < 6) {
    fprintf(
        stderr,
        "Usage: amqp_sendstring host port exchange routingkey messagebody\n");
    return 1;
  }

  hostname = argv[1];
  port = atoi(argv[2]);
  exchange = argv[3];
  routingkey = argv[4];
  messagebody = argv[5];

  conn = amqp_new_connection();

  socket = amqp_tcp_socket_new(conn);
  if (!socket) {
    die("creating TCP socket");
  }

  status = amqp_socket_open(socket, hostname, port);
  if (status) {
    die("opening TCP socket");
  }

  die_on_amqp_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN,
                               "guest", "guest"),
                    "Logging in");
  amqp_channel_open(conn, 1);
  die_on_amqp_error(amqp_get_rpc_reply(conn), "Opening channel");

  {
    amqp_basic_properties_t props;
    props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG;
    props.content_type = amqp_cstring_bytes("text/plain");
    props.delivery_mode = 2; /* persistent delivery mode */

    /**
     * 发布一条消息到broker
     *
     * 使用路由密钥在exchange上发布消息。
     *
     * 请注意,在AMQ协议级别basic.publish是一个异步方法:
     * 这意味着broker发生的错误情况(例如发布到不存在的exchange)将不会反映在此函数的返回值中。
     *
     * \param [in] state 连接对象
     * \param [in] channel 通道标识符
     * \param [in] exchange broker需要发布到的exchange
     * \param [in] routing_key 发布消息使用的路由秘钥
     * \param [in] mandatory 向broker表明该消息必须路由到一个队列。如果broker不能这样做,
     *             它应该用一个basic.return方法来回应。
     * \param [in] immediate 向broker表明该消息必须立即传递给消费者,如果broker不能这样做,
     *             它应该用一个basic.return方法来回应。
     * \param [in] properties 与消息相关的属性
     * \param [in] body 消息体
     * \return 成功返回AMQP_STATUS_OK,失败返回amqp_status_enum值
     *         注意:请注意,basic.publish是一个异步方法,此函数的返回值仅指示消息数据已
     *         成功传输到代理.它并不表示broker发生的故障,例如发布到不存在的exchange.
     *         可能的错误值:
     *         - AMQP_STATUS_TIMER_FAILURE:系统计时器设施返回错误,消息未被发送。
     *         - AMQP_STATUS_HEARTBEAT_TIMEOUT: 等待broker的心跳连接超时,消息未被发送
     *         - AMQP_STATUS_NO_MEMORY:分配内存失败,消息未被发送
     *         - AMQP_STATUS_TABLE_TOO_BIG:属性中的table太大而不适合单个框架,消息未被发送
     *         - AMQP_STATUS_CONNECTION_CLOSED:连接被关闭。
     *         - AMQP_STATUS_SSL_ERROR:发生SSL错误。
     *         - AMQP_STATUS_TCP_ERROR:发生TCP错误,errno或WSAGetLastError()可能提供更多的信息
     * 
     */
    die_on_error(amqp_basic_publish(conn, 1, amqp_cstring_bytes(exchange),
                                    amqp_cstring_bytes(routingkey), 0, 0,
                                    &props, amqp_cstring_bytes(messagebody)),
                 "Publishing");
  }

  die_on_amqp_error(amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS),
                    "Closing channel");
  die_on_amqp_error(amqp_connection_close(conn, AMQP_REPLY_SUCCESS),
                    "Closing connection");
  die_on_error(amqp_destroy_connection(conn), "Ending connection");
  return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ C 客户端收发数据实例解析 的相关文章

  • E:Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

    出现这个问题的原因可能是有另外一个程序正在运行 xff0c 导致资源被锁不可用 而导致资源被锁的原因 xff0c 可能是上次安装时没正常完成 xff0c 而导致出现此状况 解决方法 xff1a 输入以下命令 sudo rm var cach
  • shell 脚本中的引用问题

    原始代码如下 bin sh myvar 61 34 Hello world 34 echo myvar echo 34 myvar 34 echo 39 myvar 39 echo myvar echo Enter some test re
  • Linux内核的TCP源码入门(一)

    文章目录 前言一 TCP报文段结构1 报文段整体结构2 TCP首部 固定部分3 TCP首部 选项 options 二 TCP接收和发送数据1 TCP的 34 接口 34 2 发送数据3 接收数据3 1 ip层向上调用INET Socket层
  • 【API接口工具】postman-Windows版、Linux安装

    Windows安装 Postman 适用于 Windows 7 及更高版本 下载最新的 Postman 版本 选择并运行该 exe文件以安装 Postman Postman v9 4 是 Postman 的最后一个版本 xff0c 同时支持
  • 四轴飞控DIY调试起飞简明步骤

    四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1 xff1a 飞控配置Step2 xff1a 试飞目标测试内容坐标系 Step3 xff1a 试飞方法1 升降 xff08 Throttle xff09 2 偏航 xff08 yaw
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • 穿越机用途和机架尺寸

    穿越机用途和机架尺寸 1 穿越机的用途2 穿越机的机架3 机架的类型3 1 正X型机架3 2 宽X型机架3 3 长X型机架3 4 Hybrid机架3 5 涵道机架 4 总结 1 穿越机的用途 穿越机按功能分 xff0c 主要分为竞速Race
  • 关于穿越机FPV视频果冻效应的讨论

    关于穿越机FPV视频果冻效应的讨论 1 名词定义2 摄像原理2 1 快门分类2 2 常见传感器2 3 卷帘拍摄 3 产生原因4 解决方法4 1 振动出处4 2 软件方法 辅助作用 4 3 硬件方法 直接办法 5 F450试验机FPV视频问题
  • 四轴飞控DIY Mark4 - 减震

    四轴飞控DIY Mark4 减震 1 DIY Mark42 改进事项2 1 Mark4 5 inches机架2 2 2205 2450KV 无刷电机2 3 电机与机架的TPU防震2 4 飞控防震垫圈2 5 三叶平衡桨 3 试飞效果3 1 视
  • Java的压力测试工具之Jmeter

    size 61 large Apache JMeter是Apache组织开发的基于Java的压力测试工具 用于对软件做压力测试 xff0c 它最初被设计用于Web应用测试但后来扩展到其他测试领域 它可以用于测试静态和动态资源例如静态文件 J
  • 四轴飞控DIY Mark4 - 整理&参数优化

    四轴飞控DIY Mark4 整理 amp 参数优化 1 历程2 参数优化2 1 固件BF4 3 12 2 动态怠速值2 3 滤波参数2 4 电调PWM频率2 5 GPS高度配置2 6 返航速度和高度2 7 线性推力修正2 8 图传频道调整
  • ArduPilot开源飞控系统之简单介绍

    ArduPilot开源飞控系统之简单介绍 1 源由2 了解 amp 阅读2 1 ArduPilot历史2 2 关于GPLv32 3 ArduPilot系统组成2 4 ArduPilot代码结构 3 后续3 1 DIY F4503 2 软件设
  • ArduPilot Kakute F7 AIO DIYF450 之GPS配置

    ArduPilot Kakute F7 AIO DIYF450 之GPS配置 1 源由2 步骤2 1 模块预测试2 2 物理连接2 3 UART配置2 4 Compass使能2 5 GPS使能2 6 校准Compass 3 GPS amp
  • ArduPilot之开源代码框架

    ArduPilot之开源代码框架 1 系统框架2 工程框架2 1 工程目录2 2 代码组成2 3 运行流程 4 硬件传感器总线4 1 I2C4 2 SPI4 3 UART4 4 CAN 5 软件设计概念6 总结7 参考资料 在研读ArduP
  • COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法

    提出背景 xff1a 长距离寻路会出现掉帧现象 xff0c 为了提高寻路速度 xff0c 并为3D环境中的寻路方案提供基础算法实现 目前状况 xff1a 由于3D游戏对帧率要求很高 xff0c 而在游戏中进行一次长距离的寻路可能要花费8 1
  • 解析串口-接收完整数据帧

    在linux下编写串口通讯程序 xff0c 采用select监听串口的可读事件 xff0c 一旦可读 xff0c 调用read 但是我们会发现 xff0c read一次得到的数据通常不是完整的一个数据帧 比如完整数据帧为 但是实际上需要re
  • STL 基本容器 优缺点比较

    总结在先 xff1a xff11 如果需要高效的随机存取 xff0c 不在乎插入和删除的效率 xff0c 使用vector xff1b 2 如果需要大量的插入和删除元素 xff0c 不关心随机存取的效率 xff0c 使用list xff1b
  • STL源码剖析--vector容器

    写在前面 vector是我们在STL中最常用的容器 xff0c 我们对它的各种操作也都了然于胸 然而我们在使用vector的时候总会有一种很虚的感觉 xff0c 因为我们不清楚接口内部是如何实现的 在我们眼里宛如一个黑箱 xff0c 既危险
  • TCP/UDP调试工具的使用

    TCP UDP调试工具下载链接 前文 当我们写好一个TCP UDP的程序时 但是无法通信时 光看代码又找不出原因时 我们可以借助调试工具来检查是服务端还是客户端出现了问题 这样就很大的减少了错误的排查范围 再次感叹一下 这个工具真的很好用
  • 关于利用结构体和联合体数据收发的两种方法

    关于利用结构体和联合体数据收发的两种方法 关于最近接手的小项目 xff0c 有了一些经验 xff0c 所以进行一下记录 文章目录 关于利用结构体和联合体数据收发的两种方法前言一 联合体法二 结构体法小tips 前言 在我们利用自己的板子进行

随机推荐

  • RESTful初探之四(Restlets)

    size 61 large Restlets Restlet项目为 建立REST概念与Java类之间的映射 提供了一个轻量级而全面的框架 它可用于实现任何种类的REST式系统 xff0c 而不仅仅是REST式Web服务 color 61 r
  • FreeRTOS中的堆栈设置”与“系统启动文件中堆栈”的关系

    FreeRTOS中的堆栈设置 与 系统启动文件中堆栈 的关系 在STM32CubeMX生成工程时发现 xff0c 在FreeRTOS的配置中同样有TOTAL HEAP SIZE堆的大小配置 xff0c 这个堆与之前系统的堆空间有什么区别呢
  • nodejs 实现http账号密码Digest登录认证

    const http 61 require 39 http 39 const qs 61 require 39 querystring 39 const md5 61 require 39 md5 node 39 第一步 xff1a 获取n
  • PCB Layout各层含义与分层原则

    内容包括 PCB绘图软件各层含义的详细介绍以及一些在实际工作中的应用 xff0c Layout时多层板分层原则与阻抗匹配 紫色文字是超链接 xff0c 点击自动跳转至相关博文 持续更新 xff0c 原创不易 xff01 目录 xff1a 一
  • 2021-01-18

    求助 xff0c 关于Ubuntu20 04安装网络调试助手打不开的问题 我在虚拟机上安装了Ubuntu20 04并安装了网络调试助手 xff0c 但却打不开 xff0c 运用了sudo apt get libqtgui4 amd64也没用
  • 笔记:VSCode C/C++ 格式化修改设置

    VSCode安装C C 43 43 插件后 xff0c 就有了格式化代码的能力 xff0c 这个功能很好用 xff0c 一般来说不用改就可以用的很嗨皮 为啥要改默认设置 xff0c 只因不喜欢函数内大括号独占一行 xff0c 如此一屏显示的
  • NEMA 协议:GPRMC数据格式

    NEMA协议的由来 NMEA协议是为了在不同的GPS xff08 全球定位系统 xff09 导航设备中建立统一的BTCM xff08 海事无线电技术委员会 xff09 标准 xff0c 由美国国家海洋电子协会 xff08 NMEA The
  • 大小端(网络字节序)等概念

    1 大小端定义 大端存储模式 xff1a 是指数据的低位字节序保存在内存的高地址中 xff0c 而数据的高位字节序保存在内存的低地址中 小端存储模式 xff1a 是指数据的低位字节序保存在内存的低地址中 xff0c 而数据的高位字节序保存在
  • [李景山php]RHEL\CentOS 7\ubuntu16.04 下 MySQL 连接数被限制为214个

    问题 项目中 xff0c 由于连接数过多 xff0c 提示 Too many connections xff0c 需要增加连接数 我在 etc my cnf中修改了 max connections 61 2000 但是 xff0c 实际连接
  • 关系型数据库和非关系型数据库的特性以及各自的优缺点

    数据库 类型特性优点缺点关系型数据库 SQLite Oracle mysql1 关系型数据库 xff0c 是指采用了关系模型来组织 数据的数据库 xff1b 2 关系型数据库的最大特点就是事务的一致性 xff1b 3 简单来说 xff0c
  • 采用libuv的epoll方式实现的异步高性能libcurl发送数据的方法

    Libcurl较为基本的用法是easyinterface xff0c 它是最简单的同步接口 xff0c 容易理解 xff0c 实现代码简单 xff0c 但是性能低下 curl multi perform 43 select xff1a 可以
  • 各种浏览器语言包、国际化如何配置

    size 61 large 如果web项目使用了国际化多语言包 xff0c 切换浏览器语言包可以切换语言 xff1a color 61 red Firefox如何中英文切换 color 首先得下载语言包 xff0c 网址 xff1a url
  • libcurl采用curl_multi_perform() + curl_multi_wait()方式实现异步高性能l发送数据的方法

    前两篇文章 c c 43 43 调用libcurl库发送http请求的两种基本用法 采用libuv的epoll方式实现的异步高性能libcurl发送数据的方法 讲述了采用libcurl发送数据的基础方法和高性能方法 xff0c 基础方法较为
  • 网络库libevent、libev、libuv对比

    Libevent libev libuv 三个网络库 xff0c 都是c 语言实现的异步事件库Asynchronousevent library xff09 异步事件库本质上是提供异步事件通知 xff08 Asynchronous Even
  • 记flume部署过程中遇到的问题以及解决方法(持续更新)

    项目需求是将线上服务器生成的日志信息实时导入kafka xff0c 采用agent和collector分层传输 xff0c app的数据通过thrift传给agent xff0c agent通过avro sink将数据发给collector
  • c++11多线程编程(一):创建线程的三种方法

    c 43 43 11线程库 原始的c 43 43 标准仅支持单线程编程 xff0c 新的c 43 43 标准 xff08 c 43 43 11或c 43 43 0x xff09 于2011年发布 xff0c 引入了新的线程库 编译器要求 L
  • c++11多线程编程(六):事件处理

    本节讨论在多线程环境下的事件处理 有时 xff0c 线程需要等待某事件发生 xff0c 比如一个条件变为true xff0c 或者某任务被另一个线程完成 例如 xff0c 我们创建一个基于网络的应用程序 xff0c 处理如下的任务 xff1
  • C++11智能指针(六):unique_ptr介绍与例子

    本节介绍下c 43 43 11提供的智能指针实现 std unique ptr lt gt 什么是std unique ptrunique ptr lt gt 是c 43 43 11提供的智能指针实现之一 xff0c 用于防止内存泄漏 un
  • RabbitMQ图解

    RabbitMQ是一个消息队列软件 xff0c 称为消息代理或队列管理器 简单地说 xff0c 这是一个可以定义队列的软件 xff0c 应用程序可以连接到队列并将消息传输到队列中 消息可以包括任何类型的信息 例如 xff0c 它可以具有从另
  • RabbitMQ C 客户端收发数据实例解析

    rabbitmq c客户端 xff0c github地址 xff1a https github com alanxz rabbitmq c rabbitmq c是一个C语言操作的AMQP客户端库 xff0c 用来与RabbitMQ brok