📄 posmsg.c
字号:
// 消息队列操作
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdio.h>
#define MSGKEY 34856
#define MSQSIZE 1024
/*** 以下是数据类型的定义***/
#ifndef u_char
#define u_char unsigned char
#endif
typedef unsigned char uchar;
struct msgform{
long mtype;
u_char mtext[MSQSIZE];
int mlength;
};
//创建消息队列
// 参数:
// flag=0777|IPC_CREAT for server
// flag=0777 for client
// 返回:消息队列的ID 为成功 -1 为失败
int createmsg(int flag){
key_t key;
int msqid;
key=MSGKEY;
if(key<0){
perror("ftok error");
return -1;
}else{
msqid=msgget(key,flag); // 建成队列
return msqid;
}
}
//发送数据包到系统消息队列
// 参数:
// sndData: 发送的数据
// len: 数据长度
// msqid: 消息队列的ID
// type: 消息队列的类型
// = 0: 接收消息队列中的第一个报文
// > 0: 接收消息队列中的类型为msgqtype的第一个报文
// < 0: 接收消息队列中小于等于msgqtype绝对值的最低类型的第一个报文
// 返回:0 为成功 -1 为失败
int sendmsgs(u_char *sndData,int len,int msqid,int type){
struct msgform msg;
int i;
msg.mtype = type;
msg.mlength = len;
memcpy(msg.mtext,sndData,len);
// for(i=0;i<len;i++)
// printf("[%02x]",msg.mtext[i]);
if(msgsnd(msqid,&msg,len,0)==0){ // 发消息 (len 不能超过2048)
// printf("\nSend data ok!\n");
return 0;
}else{
// printf("\nSend data failed!\n");
return -1;
}
}
//接收数据包从系统消息队列
// 参数:
// rcvData: 接收的数据
// msqid: 消息队列的ID
// type: 消息队列的类型
// = 0: 接收消息队列中的第一个报文
// > 0: 接收消息队列中的类型为msgqtype的第一个报文
// < 0: 接收消息队列中小于等于msgqtype绝对值的最低类型的第一个报文
// 返回:0 为成功 -1 为失败
int receivemsg(u_char *rcvData,int msqid,int type){
int len,i;
struct msgform msg;
len=msgrcv(msqid,&msg,MSQSIZE,type,0); // 收消息
// for(i=0;i<len;i++)
// printf("[%02x]",msg.mtext[i]);
// printf("\nReceive data length=%d\n",len);
memcpy(rcvData,msg.mtext,len);
return len;
}
//删除系统消息队列
// 参数:
// msqid: 消息队列的ID
// 返回:0 为成功 -1 为失败
int delmsg(int msqid){
if(msgctl(msqid,IPC_RMID,(struct msqid_ds *)0) < 0){
perror("msgctl");
return -1;
}
printf("message succeed remove!\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -