学习笔记 c++ (简单的消息队列)

时间:2024-05-23 16:58:53

后面第二个版本是循环发布的

发送端cpp代码

#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
using namespace std;

int main()
{
    //通过ftok函数得到指定的ID。
    key_t key = ftok(".", 111); //第二个参数随便给

    if(key == -1)
    {
        perror("ftok 创建失败");
        exit(-1);
    }

    cout << "通过ftok函数创建指定的ID" << endl;
    
    //创建一个消息队列对象
    int msgid = msgget(key, IPC_CREAT|IPC_EXCL|0777);

    if(msgid == -1)
    {
        perror("创建这个消息队列失败!");
        exit(-1);
    }

    cout << "创建talker消息队列成功!" << endl;
    cout << "这个队列的ID: " << msgid << endl;


    //发送消息
    int res = msgsnd(msgid, "Hello Msg!", 10, 0);

    if(res == -1)
    {
        perror("消息发送失败:");
        exit(-1);
    }

    cout << "消息发送成功:server—>" << endl;
    return 0;
}

 

 

接收端cpp代码

#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
using namespace std;

int main()
{
    //通过ftok函数得到指定的ID。
    key_t key = ftok(".", 111); //第二个参数随便给

    if(key == -1)
    {
        perror("ftok 获取失败");
        exit(-1);
    }

    cout << "通过ftok函数得到指定的ID" << endl;
    
    //创建一个消息队列对象
    int msgid = msgget(key, 0);

    if(msgid == -1)
    {
        perror("创建这个消息队列失败!");
        exit(-1);
    }

    cout << "创建lisenter消息队列成功!" << endl;
    cout << "这个队列的ID: " << msgid << endl;

    //存放接收的消息
    char buffer[128];

    //接收消息
    int res = msgrcv(msgid, buffer, 128, 0, 0);

    if(res == -1)
    {
        perror("消息接收失败:");
        exit(-1);
    }

    cout << "消息接收成功:client->" << buffer << endl;
    return 0;
}

先通过ipcs查看系统消息队列和共享内存

学习笔记 c++ (简单的消息队列)

 前面的消息队列是我们发送端创建的,先删除它,再重新执行发送和接收

学习笔记 c++ (简单的消息队列)

 重新执行两个cpp的文件

学习笔记 c++ (简单的消息队列)

 学习笔记 c++ (简单的消息队列)

执行成功

 

循环发送版本

发送端cpp

#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
using namespace std;

int main()
{
    //通过ftok函数得到指定的ID。
    key_t key = ftok(".", 111); //第二个参数随便给

    if(key == -1)
    {
        perror("ftok 创建失败");
        exit(-1);
    }

    cout << "通过ftok函数创建指定的ID" << endl;
    
    //创建一个消息队列对象
    int msgid = msgget(key, IPC_CREAT|IPC_EXCL|0777);

    if(msgid == -1)
    {
        perror("创建这个消息队列失败!");
        exit(-1);
    }

    cout << "创建talker消息队列成功!" << endl;
    cout << "这个队列的ID: " << msgid << endl;


    char a[100]={"hello chao ge"};
    int b = sizeof(a);
  while(1)
  {
    sleep(1);
    //发送消息
    int res = msgsnd(msgid, a, b, 0);

    if(res == -1)
    {
        perror("消息发送失败:");
        exit(-1);
    }

    cout << "消息发送成功:server—>" << endl;
  }
    return 0;
}

 

接收端cpp

 

#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
using namespace std;

int main()
{
    //通过ftok函数得到指定的ID。
    key_t key = ftok(".", 111); //第二个参数随便给

    if(key == -1)
    {
        perror("ftok 获取失败");
        exit(-1);
    }

    cout << "通过ftok函数得到指定的ID" << endl;
    
    //创建一个消息队列对象
    int msgid = msgget(key, 0);

    if(msgid == -1)
    {
        perror("创建这个消息队列失败!");
        exit(-1);
    }

    cout << "创建lisenter消息队列成功!" << endl;
    cout << "这个队列的ID: " << msgid << endl;

    //存放接收的消息
    char buffer[128];
 while(1)
 {
    sleep(1);
    //接收消息
    int res = msgrcv(msgid, buffer, 128, 0, 0);

    if(res == -1)
    {
        perror("消息接收失败:");
        exit(-1);
    }

    cout << "消息接收成功:client->" << buffer << endl;
 }
    return 0;
}

结果

学习笔记 c++ (简单的消息队列)

 

 多消息发送队列:这里就是比前面多加一个结构体

发送端cpp

#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include "string.h"
using namespace std;

struct msg
{
    long m_type;
    char m_messga[256];
};

int main()
{
    //通过ftok函数得到指定的ID。
    key_t key = ftok(".", 111); //第二个参数随便给

    if(key == -1)
    {
        perror("ftok 创建失败");
        exit(-1);
    }

    cout << "通过ftok函数创建指定的ID" << endl;
    
    //创建一个消息队列对象
    int msgid = msgget(key, IPC_CREAT|IPC_EXCL|0777);

    if(msgid == -1)
    {
        perror("创建这个消息队列失败!");
        exit(-1);
    }

    cout << "创建talker消息队列成功!" << endl;
    cout << "这个队列的ID: " << msgid << endl;

    
    struct msg msg1, msg2;
    msg1.m_type = 1;
    msg2.m_type = 2;

    strcpy(msg1.m_messga , "123456");
    strcpy(msg2.m_messga , "abcdse");
 while(1)
 {

    //发送消息1
    int res = msgsnd(msgid, &msg1, strlen(msg1.m_messga), 0);

    if(res == -1)
    {
        perror("消息发送失败:");
        exit(-1);
    }
    cout << "消息发送成功:server—>" << endl;
    cout<<"发送消息1 成功"<<msg1.m_messga<<endl;

    //发送消息2
    res = msgsnd(msgid, &msg2, strlen(msg2.m_messga), 0);

    if(res == -1)
    {
        perror("消息发送失败:");
        exit(-1);
    }
    cout<<"发送消息2 成功"<<msg1.m_messga<<endl;
    cout<<endl;
    sleep(1);

 }
    return 0;
}

接收端cpp

#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
using namespace std;

struct msg
{
    long m_type;
    char m_messga[256];
};

int main()
{
    //通过ftok函数得到指定的ID。
    key_t key = ftok(".", 111); //第二个参数随便给

    if(key == -1)
    {
        perror("ftok 获取失败");
        exit(-1);
    }

    cout << "通过ftok函数得到指定的ID" << endl;
    
    //创建一个消息队列对象
    int msgid = msgget(key, 0);

    if(msgid == -1)
    {
        perror("创建这个消息队列失败!");
        exit(-1);
    }

    cout << "创建lisenter消息队列成功!" << endl;
    cout << "这个队列的ID: " << msgid << endl;

    //存放接收的消息

    struct msg msg_tem;
    struct msg msg_tem2;
 while(1)
 {

    //接收消息1 参数(1)代表它的type 在前面定义消息1的时候的 type = 1;
    int res = msgrcv(msgid, &msg_tem, sizeof(msg_tem)-4, 1, 0);

    if(res == -1)
    {
        perror("消息接收失败:");
        exit(-1);
    }

    cout << "消息接收成功:client1->" << msg_tem.m_messga << endl;


    //接收消息2 参数(2)代表它的type 在前面定义消息2的时候的 type = 2;
        res = msgrcv(msgid, &msg_tem2, sizeof(msg_tem2)-4, 2, 0);

    if(res == -1)
    {
        perror("消息接收失败:");
        exit(-1);
    }

    cout << "消息接收成功:client2->" << msg_tem2.m_messga << endl;
    cout<<endl;
    sleep(1);
 }
    return 0;
}

学习笔记 c++ (简单的消息队列)