消息队列接口的简单封装

//头文件msgipc_msg.h
#ifndef _WBM_MY_MSG_H_
#define _WBM_MY_MSG_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <sys/msg.h>



#ifdef __cplusplus
extern "C" {
#endif


#define MSGERR_BASE 200
#define MSGERR_PARAM  (MSGERR_BASE + 1)
#define MSGERR_EEXISTS (MSGERR_BASE + 2)
#define DATALEN 1024*10



typedef struct _msg
{
    long mtype;
    char p[DATALEN];
} MSG;

/**
 * [msg_create 创建消息队列]
 * @param  key   [key 值]
 * @param  msgid [out 消息队列的标识符]
 * @return       []
 */
int msg_create(int key, int *msgid);

/**
 * [msg_open 打开消息队列]
 * @param  key   [key 值]
 * @param  msgid [out 消息队列的标识符]
 * @return       []
 */
int msg_open(int key, int *msgid);

/**
 * [msg_send 发送信息]
 * @param  msgid   [消息队列的标识符]
 * @param  buf     [in 带发送内容地址]
 * @param  butlen  [发送信息体长度]
 * @param  msgtype [消息的类型]
 * @param  flag    [函数的控制属性]
 * @return         []
 */
int msg_send(int msgid, char *buf, int butlen, int msgtype, int flag);

/**
 * [msg_recv 接收信息]
 * @param  msgid   [消息队列的标识符]
 * @param  buf     [接收信息体的地址]
 * @param  butlen  [信息长度]
 * @param  msgtype [消息的类型]
 * @param  flag    [函数的控制属性]
 * @return         []
 */
int msg_recv(int msgid, char *buf, int *butlen, int msgtype, int flag);

/**
 * [msg_del 消息队列删除]
 * @param  msgid [消息队列的标识符]
 * @return       []
 */
int msg_del(int msgid);


#ifdef __cplusplus
}
#endif

#endif
//源文件msgipc_msg.c
#include "msgipc_msg.h"



int msg_create(int key, int *msgid)
{
    int ret = 0;
    int tmpid = 0;
    if(msgid == NULL)
    {
        ret = MSGERR_PARAM;
        printf("fun msg_create() err:%d\n", ret);
        return ret;
    }
    tmpid = msgget(key, 0666 | IPC_CREAT | IPC_EXCL);
    if(msgid < 0)
    {
        ret = errno;
        printf("fun msg_create() err:%d\n", ret);
        return ret;
    }
    *msgid = tmpid;
    return ret;
}

int msg_open(int key, int *msgid)
{
    int ret = 0;
    int tmpid = 0;
    if(msgid == NULL)
    {
        ret = MSGERR_PARAM;
        printf("fun msg_open() err:%d\n", ret);
        return ret;
    }
    tmpid = msgget(key, 0666);
    if(tmpid < 0)
    {
        ret = errno;
        printf("fun msg_open() err:%d\n", ret);
        return ret;
    }
    *msgid = tmpid;
    return ret;
}

int msg_send(int msgid, char *buf, int butlen, int msgtype, int flag)
{
    MSG msg;
    int ret = 0;
    if(buf == NULL)
    {
        ret = MSGERR_PARAM;
        printf("fun msg_send() err:%d\n", ret);
        return ret;
    }
    memset(&msg, 0, sizeof(MSG));
    msg.mtype = msgtype;
    strcpy(msg.p, buf); // 正文内容

    ret = msgsnd(msgid, &msg, butlen, flag);
    if(ret < 0)
    {
        ret = errno;
        printf("fun msgsnd() err:%d---butlen=%d\n", ret, butlen);
        return ret;
    }
    return ret;
}

int msg_recv(int msgid, char *buf, int *butlen, int msgtype, int flag)
{
    int ret = 0;
    if(buf == NULL || butlen == NULL)
    {
        ret = MSGERR_PARAM;
        printf("fun msg_recv() err:%d\n", ret);
        return ret;
    }

    MSG msg;
    memset(&msg, 0, sizeof(MSG));
    ret = msgrcv(msgid, &msg, sizeof(msg.p), msgtype, flag);
    if(ret < 0)
    {
        ret = errno;
        printf("fun msgrcv() err:%d\n", ret);
        return ret;
    }
    memcpy(buf, msg.p, ret);
    *butlen = ret;
    ret = 0;
    return ret;
}

int msg_del(int msgid)
{
    int ret = 0;
    ret = msgctl(msgid, IPC_RMID, NULL);
    if(ret == -1)
    {
        ret = errno;
        printf("fun msg_del() err:%d\n", ret);
        return ret;
    }
    return ret;
}
//测试案例
/*************************************************************************
  > File Name: main.c
  > Author: pog
  > Mail: 10864315@qq.com
  > Created Time: 2017-01-15 19:40:06
 ************************************************************************/
#include "msgipc_msg.h"


int main(int argc, char *argv[])
{
    int ret = 0;
    int key = 0x1234;
    int msgid;
    ret =  msg_create(key, &msgid);
    if(ret)
        return ret;

    //发送
    ret = msg_send(msgid, "1234567890", 5, 10, 0);
    if(ret)
        return ret;

    //读取
    int len = 100;
    char buf[100] = {0};
    ret = msg_recv(msgid, buf, &len, 10, 0);
    if(ret)
        return ret;

    printf("recv = %s\n", buf);

    msg_del(msgid);
    return 0;
}

下载

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RabbitMQ 是一个开源的消息队列系统,它使用 AMQP(Advanced Message Queuing Protocol)来进行消息的传递。RabbitMQ 提供了丰富的功能和灵活性,但在使用时可能需要一些封装来简化操作和提高开发效率。 在封装 RabbitMQ 时,可以考虑以下几个方面: 1. 连接管理:封装连接管理可以处理连接的建立和关闭,以及连接的断开重连等情况。这样可以避免在每次使用 RabbitMQ 时都手动创建和关闭连接,提高代码的可维护性。 2. 队列声明和绑定:封装队列的声明和绑定操作可以简化创建队列和绑定交换机的过程。可以提供一个统一的接口,传入队列名称、交换机名称等参数,封装具体的操作细节。 3. 消息发送和接收:封装消息的发送和接收过程可以提供简单易用的接口,隐藏底层的细节。可以提供异步发送和接收的方式,支持回调函数或事件监听机制,方便处理消息的处理逻辑。 4. 错误处理和重试:封装错误处理和重试机制可以增加消息传递的可靠性。当消息发送或接收失败时,可以进行重试或记录错误日志,确保消息不会丢失。 5. 消费者管理:封装消费者的管理可以简化消费者的创建和启动过程。可以提供一个统一的接口,传入消费者处理函数,封装具体的消费者启动和处理逻辑。 6. 消息确认和拒绝:封装消息的确认和拒绝机制可以确保消息的可靠传递。可以提供自动确认或手动确认的方式,确保消息被正确处理。 以上是一些常见的封装思路,具体的封装方式可以根据实际需求和项目情况进行调整和扩展。在封装时,可以参考一些已有的 RabbitMQ 封装库,如 Spring AMQP 等,也可以根据自己的需求进行定制化封装
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的马良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值