首页 > 其他分享 >IPC-MQ-代码示例

IPC-MQ-代码示例

时间:2024-01-24 14:00:51浏览次数:33  
标签:IPC return 示例 int msgId MQ msg buf

客户端-服务端

版本一

Code
int commom_msg(int msgFlag)
{
	// 生成IPC关键字
	key_t k = ftok(PATHNAME, PROJ_ID);
	// 获取消息队列ID
	int msgId = msgget(k, msgFlag);
	if (msgId < 0)
	{
		perror("msgget error");
		return -2;
	}
	return msgId;
}
int get_msg(void)
{
	return commom_msg(IPC_CREAT);
}
int create_msg_queue(void)
{
	return commom_msg(IPC_CREAT | IPC_EXCL | 0666); // | 0666
}
int delete_msg(int msgID)
{
	int ret = msgctl(msgID, IPC_RMID, 0);
	if (ret < 0)
	{
		perror("msgctl error");
		return -1;
	}
	return 0;
}
int send_msg(int msgId, long type, const char *sendInfo)
{
	struct msgbuf msg;
	msg.msg_type = type;
	strcpy(msg.msg_text, sendInfo);
	int send = msgsnd(msgId, &msg, sizeof(msg.msg_text), 0);
	if (send < 0)
	{
		perror("send error");
		return -1;
	}
	return 0;
}
int recv_msg(int msgId, long type, char buf[])
{
	struct msgbuf msg;
	int rcv = msgrcv(msgId, &msg, sizeof(msg.msg_text), type, 0);
	if (rcv < 0)
	{
		perror("msgrcv error");
		return -1;
	}
	strcpy(buf, msg.msg_text);
	return 0;
}
void mq_func_client(void)
{
	int msgId = get_msg();
	char buf[MAX];
	while (1)
	{
		printf("Client input:");
		fflush(stdout);
		ssize_t s = read(0, buf, sizeof(buf) - 1);
		if (s > 0)
		{
			buf[MAX - 1] = '\0';
			send_msg(msgId, CLIENT_TYPE, buf);
		}
		recv_msg(msgId, SEVER_TYPE, buf);
		if (strcmp("exit", buf) == 0)
		{
			printf("All exit\n");
			break;
		}
	}
	//delete_msg(msgId);
}
void mq_func_server(void)
{
	char buf_msg[MAX];
	int msgID = create_msg_queue();
	while (1)
	{
		recv_msg(msgID, CLIENT_TYPE, buf_msg);
		printf("Client say:%s\n", buf_msg);
		printf("Server input:");
		fflush(stdout);
		ssize_t s = read(0, buf_msg, sizeof(buf_msg) - 1);
		if (s > 0)
		{
			buf_msg[MAX - 1] = '\0';
			send_msg(msgID, SEVER_TYPE, buf_msg);
			if (strcmp(buf_msg, "exit") == 0)
				break;
		}
	}
	delete_msg(msgID);
}

参考链接

内核MQ读取

版本一

Code
int message_send_main_function(void)
{
	int i, res;
	int msgId = msgget(0x8888, IPC_CREAT | 0x664);
	Msg msgBuf[10] = {
		{1, {"Luffy", 17}},
        {1, {"Zoro", 19}},
        {2, {"Nami", 18}},
        {2, {"Usopo", 17}},
        {1, {"Sanji", 19}},
        {3, {"Chopper", 15}},
        {4, {"Robin", 28}},
        {4, {"Franky", 34}},
        {5, {"Brook", 88}},
        {6, {"Sunny", 2}}
	};
	for (i = 0; i < 10; i++)
	{
		res = msgsnd(msgId, &msgBuf, sizeof(Person), 0);
	}
	return 0;
}
void print_msg(Msg *msg)
{
	printf("{ type = %ld, name = %s, age = %d }\n",
		msg->mtype, msg->person.name, msg->person.age);
	return;
}
int message_recv_main_function(void)
{
#if 0
	if (argc < 2) {
		printf("usage: %s \n", argv[0]);
		return -1;
	}
	long type = atol(argv[1]);
#endif
	//long type = atol("1");
	long type = 1;
	int msgId = msgget(0x8888, 0);
	Msg msgBuf;
	int res;
	while (1)
	{
		res = msgrcv(msgId, &msgBuf, sizeof(Person), type, IPC_NOWAIT);
		if (res < 0)
		{
			if (errno == ENOMSG)
			{
				printf("No message\n");
				break;
			}
			printf("No message 1\n");
			break;
		}
		print_msg(&msgBuf);
	}
	return 0;
}

参考链接

标签:IPC,return,示例,int,msgId,MQ,msg,buf
From: https://www.cnblogs.com/starcos/p/17984540

相关文章

  • IPC-MQ-msgget-msgrcv-msgsnd-msgctl
    msgget创建和打开消息队列函数创建和标志位的控制逻辑msgrcv从消息队列中读取一条新消息的函数msgrcvmsgsnd将消息送入消息队列的函数msgsnd参数msgctl获取和设置消息队列的属性函数......
  • rocketmq--死信队列
    在RocketMQ中,死信队列(DeadLetterQueue,DLQ)用于存放无法成功消费的消息。当消息重试消费次数超过设定的阈值后,消息将被转移到死信队列。使用SpringBoot集成RocketMQ时,可以通过以下步骤来处理死信队列中的消息。首先,在pom.xml中添加RocketMQSpringBootStarter的依赖:<dependen......
  • Optional类的使用示例
    Optional类是Java8中引入的一个新特性,它可以用来解决空指针异常的问题。在之前的版本中,如果一个方法返回的结果有可能为空,我们通常需要在使用该结果之前进行判空操作,以避免出现NullPointerException。而使用Optional类可以更加简洁和安全地处理这种情况。下面是一个使用Optional......
  • rocketmq--同步、异步、批量、事务消息demo
    在SpringBoot中使用RocketMQ进行同步和异步消息传输的关键是使用RocketMQTemplate类。下面是两个例子,分别演示了如何实现同步和异步消息传输。首先,确保你已经添加了RocketMQ的依赖到你的pom.xml中,如下所示:<dependency><groupId>org.apache.rocketmq</groupId><artifa......
  • rocketmq--消息顺序消费demo
    在RocketMQ中,要实现消息的顺序消费,你需要确保以下几点:发送消息时,相同业务顺序的消息应该发送到同一个队列(MessageQueue)。消费者在消费时,应该使用顺序消费的方式。下面是一个使用SpringBoot和RocketMQ实现消息顺序消费的例子。添加依赖(pom.xml):<dependencies><de......
  • ERROR:Only one ConfirmCallback is supported by each RabbitTemplate] with root cau
     错误:OnlyoneConfirmCallbackissupportedbyeachRabbitTemplate]withrootcause 原因:因为Spring的Bean默认都是单例;而RabbitTemplate对象同样支持一个回调。 解决:使用@Scope("prototype")可通知Spring将被注解的Bean变为多例。代码: //改Ra......
  • rocketmq--中的7种消息类型
    RocketMQ支持多种消息类型,每种类型都适用于不同的业务场景。下面是一些常见的消息类型及其特点:普通消息(NormalMessage):这是最基本的消息类型,没有任何特殊属性。生产者发送消息到指定的主题,消费者从主题订阅并消费这些消息。普通消息不保证严格的顺序。顺序消息(OrderedM......
  • rocketmq--有哪些关键名词
    RocketMQ是一个开源的分布式消息中间件,它具有高性能、高吞吐量、可扩展性和可靠性等特点。在使用RocketMQ时,你会遇到以下几个关键概念:NameServer(名称服务):NameServer是RocketMQ的注册中心,负责维护所有Broker的路由信息,供生产者和消费者查询。生产者和消费者启动时,需要连接到Nam......
  • rocketmq--两种消息模型的区别及demo
    RocketMQ主要支持两种消息模型:集群消费(Clustering)和广播消费(Broadcasting)。集群消费(Clustering):在集群消费模式下,同一个消费者组(ConsumerGroup)中的消费者实例平均分摊消费消息,即一个消息只会被消费者组中的一个消费者消费一次。这种模式适用于负载均衡场景,可以提高消费的并......
  • EMQX配置用户名和密码开启emqx_auth_mnesia认证方式连接
    1、找到MQtt的/etc/plugins/文件夹下的emqx_auth_mnesia.conf文件 vim打开编辑该文件,根据例子添加账号密码并保存 添加内容:auth.user.1.username=adminauth.user.1.password=123456 2、配置禁止匿名登录(安全认证)找到emqx.conf编辑##Allowanonymousaut......