后面第二个版本是循环发布的
发送端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查看系统消息队列和共享内存
前面的消息队列是我们发送端创建的,先删除它,再重新执行发送和接收
重新执行两个cpp的文件
执行成功
循环发送版本
发送端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;
}
结果
多消息发送队列:这里就是比前面多加一个结构体
发送端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;
}