rabbitmq-c 程序实现客户端服务端

安装mq

https://blog.csdn.net/zl_momomo/article/details/82986368

需要安裝rabbitmq-server

开启rabbitmq服务
systemctl start rabbitmq-server
systemctl enable rabbitmq-server.

客户端 amqp_sendstring.c

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

#include <amqp.h>
// #include <rabbitmq-c/tcp_socket.h>

// #include "utils.h"

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

    hostname = "localhost";
    port = 5672;
    exchange = "amq.topic";
    routingkey = "test";
    messagebody = argv[1];

    conn = amqp_new_connection();

    if (NULL == (socket = amqp_tcp_socket_new(conn)))
    {
        printf("creating TCP socket\n");
    }

    if (AMQP_STATUS_OK != amqp_socket_open(socket, hostname, port))
    {
        printf("opening TCP socket\n");
    }

    rpc_reply = amqp_login(conn, "/", 0, AMQP_DEFAULT_FRAME_SIZE, AMQP_DEFAULT_HEARTBEAT, AMQP_SASL_METHOD_PLAIN, "guest", "guest");
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("xxxxxxxx\n");

    // die_on_amqp_error(amqp_login(conn, "/", 0, 131072, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"), "Logging in");
    if (NULL == amqp_channel_open(conn, 1))
        printf("xxxxxxxx2\n");

    rpc_reply = amqp_get_rpc_reply(conn);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Opening channel\n");
    else
    {
        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 */
        if (0 != amqp_basic_publish(conn, 1, amqp_cstring_bytes(exchange), amqp_cstring_bytes(routingkey), 0, 0, &props, amqp_cstring_bytes(messagebody)))
            printf("Publishing\n");
    }

    rpc_reply = amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Closing channel\n");
    rpc_reply = amqp_connection_close(conn, AMQP_REPLY_SUCCESS);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Closing connection");
    amqp_destroy_connection(conn);
    return 0;
}

服务端 amqp_listen.c

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <amqp.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_rpc_reply_t        rpc_reply;

    amqp_bytes_t queuename;

    hostname = "localhost";
    port = 5672;
    exchange = "amq.topic";
    bindingkey = "test";

    conn = amqp_new_connection();

    socket = amqp_tcp_socket_new(conn);
    if (!socket)
    {
        printf("creating TCP socket\n");
    }

    if (AMQP_STATUS_OK != amqp_socket_open(socket, hostname, port))
    {
        printf("opening TCP socket\n");
    }

    rpc_reply = amqp_login(conn, "/", 0, AMQP_DEFAULT_FRAME_SIZE, AMQP_DEFAULT_HEARTBEAT, AMQP_SASL_METHOD_PLAIN, "guest", "guest");
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("xxxxxxxx\n");

    if (NULL == amqp_channel_open(conn, 1))
        printf("xxxxxxxx2\n");

    // 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");
    rpc_reply = amqp_get_rpc_reply(conn);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Opening channel\n");
    else
    {
        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");
        rpc_reply = amqp_get_rpc_reply(conn);
        if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
            printf("Declaring queue\n");
        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");
    rpc_reply = amqp_get_rpc_reply(conn);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Binding queue\n");

    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");
    rpc_reply = amqp_get_rpc_reply(conn);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Consuming\n");
    else
    {
        for (;;)
        {
            amqp_rpc_reply_t res;
            amqp_envelope_t  envelope;

            amqp_maybe_release_buffers(conn);

            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");
            printf("===%s\n\n", envelope.message.body.bytes);
            // amqp_dump(envelope.message.body.bytes, envelope.message.body.len);

            amqp_destroy_envelope(&envelope);
        }
    }

    amqp_bytes_free(queuename);
    rpc_reply = amqp_channel_close(conn, 1, AMQP_REPLY_SUCCESS);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Closing channel\n");
    rpc_reply = amqp_connection_close(conn, AMQP_REPLY_SUCCESS);
    if (AMQP_RESPONSE_NORMAL != rpc_reply.reply_type)
        printf("Closing connection");
    amqp_destroy_connection(conn);

    return 0;
}

编译:

gcc amqp_listen.c utils.c -lrabbitmq -o s			
gcc amqp_sendstring.c utils.c -lrabbitmq -o c

测试:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/491056.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

访问二维数组本质

先从一维数组讲起 int main() {int arr[5] { 1,2,3,4,5 };for (int i 0; i < 5; i) {printf("%d",arr[i]); //对数组进行访问}return 0; } 其实 arr [ i ] * (arr i) 这两个是完全相等的&#xff0c;在c语言指针&#xff08;1&#xff09;8.数组名与 …

STM32F103 CubeMX 使用USB生成键盘设备

STM32F103 CubeMX 使用USB生成键盘设备 基础信息HID8个数组各自的功能 生成代码代码编写添加申明信息main 函数编写HID 修改1. 修改报文描述符2 修改 "usbd_hid.h" 中的申明文件 基础信息 软件版本&#xff1a; stm32cubmx&#xff1a;6.2 keil 5 硬件&#xff1a;…

Redis中的事件(三)

时间事件 事件的调度与执行 因为服务器中同时存在文件事件和时间事件两种事件类型&#xff0c;所以服务器必须对这两种事件进行调度&#xff0c;决定何时应该处理文件事件&#xff0c;何时有应该处理时间事件&#xff0c;以及花多少事件来处理它们等等。事件的调度和执行由ae…

uniApp中使用小程序XR-Frame创建3D场景(2)加载模型

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用&#xff0c;只完成了简单的环境搭建&#xff0c;这篇文章讲解如何加载3D模型。 1 加入模型加载标签 在XR-Frame框架中&#xff0c;加载资源都是在wxml文件的标签中实现的。下面是wxml中完整的代码 index.wxml &l…

(二)Eureka服务搭建,服务注册,服务发现

1.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 存在几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0c;…

手机和键盘的数字键盘排序为什么是不同的?

不知道你有没有注意有一个问题。我们的手机输入法中的数字键盘&#xff0c;电脑上通用的数字键盘&#xff0c;计算器上的数字键盘等排序是不同的&#xff0c;从观察者角度看&#xff0c;0-9的数字排列有从上到下的排列&#xff0c;还有从下到上的排列。为什么会出现不同的排列方…

HWOD:句子逆序

一、题目 描述 将一个英文语句以单词为单位逆序排放。例如I am a boy逆序排放后为boy a am I。所有单词之间用一个空格隔开。语句中除了英文字母外&#xff0c;不再包含其他字符。 数据范围 输入的字符串长度满足 1<n<1000 输入 输入一个英文语句&#xff0c;每个…

【电力监控保护】AM5SE-IS防孤岛保护装置/35kV、10kV、380V分布式光伏并网供电/什么是孤岛效应/孤岛效应的危害

什么是孤岛效应&#xff01;&#xff01;&#xff01; 安科瑞薛瑶瑶18701709087 在电力系统中&#xff0c;孤岛效应指的是当电网突然断电时&#xff0c;并网光伏发电系统仍然保持对电网中部分线路的供电状态。这种情况下&#xff0c;这些线路与其他电网断开&#xff0c;形成了…

HarmonyOS页面布局方式

Column&Row组件的使用 1 概述 一个丰富的页面需要很多组件组成&#xff0c;那么&#xff0c;我们如何才能让这些组件有条不紊地在页面上布局呢&#xff1f;这就需要借助容器组件来实现。 容器组件是一种比较特殊的组件&#xff0c;它可以包含其他的组件&#xff0c;而且…

亚马逊美国站CPC认证婴儿门栏和围栏安全标准cpsc办理

美国ASTM F1004-19认证属于婴幼儿门栏和围栏安全标准 ASTM F1004-19婴幼儿门栏和围栏安全标准 2020年7月6日&#xff0c;美国消费品安全委员会发布了最终法规16 CFR 1239&#xff0c;为婴幼儿门栏和围栏建立了安全标准。该法规合并及修订了最新版本的ASTM F1004-19《婴幼儿扩展…

【分布式】——降级熔断限流

降级&熔断&限流 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点…

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记11:数字电位器MCP4017

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

高速行者,5G工业路由器助力车联网无缝通信

随着5G技术的飞速发展&#xff0c;智能制造正迎来一个全新的时代。5G工业路由器作为车联网的核心设备&#xff0c;正在发挥着关键的作用。它不仅提供高速稳定的网络连接&#xff0c;还支持大规模设备连接和高密度数据传输&#xff0c;为车辆之间的实时通信和信息交换提供了强有…

GitLab更新失败(CentOS)

使用yum更新GitLab&#xff0c;出现如下错误提示&#xff1a; Error: Failed to download metadata for repo gitlab_gitlab-ce: repomd.xml GPG signature verification error: Bad GPG signature 编写如下脚本&#xff1a; for pubring in /var/cache/dnf/gitlab_gitlab-?…

java Web会议信息管理系统 用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 jsp 会议信息管理系统是一套完善的web设计系统&#xff0c;对理解JSP java SERLVET mvc编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&am…

react native

简介 React Native 就是使用React和应用平台的原生功能来构建 Android 和 iOS 应用的开源框架。在 Android 和 iOS 开发中&#xff0c;一个视图是 UI 的基本组成部分&#xff0c;React 组件通过 JavaScript 来调用这些视图。可以构建自己的 Native Components(原生组件)&#…

智慧体育场馆的优势都有哪些?

体育场馆作为体育产业和事业发展的重要载体&#xff0c;全民对健康和运动的需求越来越大&#xff0c;体育馆的需求也更大。而以前的体育场馆管理不仅人工成本高&#xff0c;人民的使用和消费也不方便。因此智慧体育馆的出现大大降低了运营人力成本及现金管理风险&#xff0c;大…

Jmeter脚本优化——随机函数

线程组下有 2 个请求的参数中均使用到相同的参数&#xff0c;在进行参数化时&#xff0c;想 要每个请求使用不同的取值。 &#xff08; 1 &#xff09; 线程组设置如下 &#xff08; 2 &#xff09; 线程组下添加加购物车请求&#xff0c;请求传参包含商品 id &#xff08;…

发车,易安联签约某新能源汽车领军品牌,为科技创新保驾护航

近日&#xff0c;易安联成功签约某新能源汽车领军品牌&#xff0c;为其 数十万终端用户 建立一个全新的 安全、便捷、高效一体化的零信任终端安全办公平台。 随着新能源汽车行业的高速发展&#xff0c;战略布局的不断扩大&#xff0c;技术创新不断引领其市场价值走向高点&am…