Linux 利用消息隊列寫一個簡單的聊天信息

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
代碼:
1./q_read

#include <stdio.h> 
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#define _SIZE_ 10000


//key_t ftok(const char *pathname, int proj_id);
/*創建一個消息隊列*/
/*int msgget(key_t key, int msgflg);
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);*/


typedef struct _msg
{
	long mtype;		 // 消息類型
	char mtext[100]; // 消息正文
	//…… ……          // 消息的正文可以有多個成員
}MSG;


void send(){

	/*創建隊列*/
	key_t key=0;

	int msgqid=0;

	MSG msg;

	memset(&msg,0,sizeof(msg));


	/*ftok =路徑名字+項目ID*/
	key = ftok("./",2015);//key 

	/*創建或者查找已經存在的,消息隊列,只要有相同的key 
	*就能夠得到同一個消息隊列
	*IPC_CREAT:創建消息隊列
	*IPC_EXCL:檢查隊列消息是否存在
	*/
	msgqid = msgget(key,IPC_CREAT|0666);

	if(msgqid == -1){

			perror("msgget");
			exit(-1);
	}

	/*將信息添加到隊列裏面*/
	
	msg.mtype = 10 ;//消息種類
	 
	printf("send information to lyx :\n");
	gets(msg.mtext);//正文內容

	/*發送信息
	*msg_id:消息隊列標識符
	*&msg:消息結構體地址
	*sizeof(msd)-sizeof(long):消息正文大小
	*0:習慣用0
	*/
	msgsnd(msgqid,&msg,sizeof(msg)-sizeof(long),0);

	printf("\n");


	/*
	msgrcv(msgqid,&msg,sizeof(msg)-sizeof(long),(long)10,0);


	printf("receive information from lyx:\n");
	printf("msg.mtext=%s\n",msg.mtext);


	//刪除消息對列
	//IPC_RMID:刪除標誌位
	msgctl(msgqid,IPC_RMID,NULL);*/


	
}
void receive(){
		//while(1){

	printf("receive information from lmj:\n");

	/*創建隊列*/
	key_t key=0;

	int msgqid=0;

	MSG msg;

	/*將信息添加到隊列裏面*/
	memset(&msg,0,sizeof(msg)); 

	/*ftok =路徑名字+項目ID*/
	key = ftok("./",2019);//key 

	/*創建或者查找已經存在的,消息隊列,只要有相同的key 
	*就能夠得到同一個消息隊列
	*IPC_CREAT:創建消息隊列
	*IPC_EXCL:檢查隊列消息是否存在
	*/
	msgqid = msgget(key,IPC_CREAT|0666);

	if(msgqid == -1){

			perror("msgget");
			exit(-1);
	}

	/*取出10 的信息
	*msg_id:消息隊列標識符
	*&msg:消息結構體地址
	*sizeof(msd)-sizeof(long):消息正文大小
	*(long)10:消息的類型
	*0:習慣用0
	*/
	msgrcv(msgqid,&msg,sizeof(msg)-sizeof(long),(long)3,0);
	printf("msg.mtext=%s\n",msg.mtext);
	msgctl(msgqid,IPC_RMID,NULL);
	printf("\n");
 	//}
    
}

int main(){
	
	while(1){

		send();
		receive();
	}

	return 0;
	
}

2./q_write

#include <stdio.h> 
#include <unistd.h>
#include <string.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdlib.h>
#define _SIZE_ 10000


//key_t ftok(const char *pathname, int proj_id);
/*創建一個消息隊列*/
/*int msgget(key_t key, int msgflg);
int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);
int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);*/


typedef struct _msg
{
	long mtype;		 // 消息類型
	char mtext[100]; // 消息正文
	//…… ……          // 消息的正文可以有多個成員
}MSG;

void receive(){

	//while(1){

	printf("receive information from lmj:\n");

	/*創建隊列*/
	key_t key=0;

	int msgqid=0;

	MSG msg;

	/*將信息添加到隊列裏面*/
	memset(&msg,0,sizeof(msg)); 

	/*ftok =路徑名字+項目ID*/
	key = ftok("./",2015);//key 

	/*創建或者查找已經存在的,消息隊列,只要有相同的key 
	*就能夠得到同一個消息隊列
	*IPC_CREAT:創建消息隊列
	*IPC_EXCL:檢查隊列消息是否存在
	*/
	msgqid = msgget(key,IPC_CREAT|0666);

	if(msgqid == -1){

			perror("msgget");
			exit(-1);
	}

	/*取出10 的信息
	*msg_id:消息隊列標識符
	*&msg:消息結構體地址
	*sizeof(msd)-sizeof(long):消息正文大小
	*(long)10:消息的類型
	*0:習慣用0
	*/
	msgrcv(msgqid,&msg,sizeof(msg)-sizeof(long),(long)10,0);
	printf("msg.mtext=%s\n",msg.mtext);
	msgctl(msgqid,IPC_RMID,NULL);
	printf("\n");
 	//}
    
	
}
void send(){
	/*創建隊列*/
	key_t key=0;

	int msgqid=0;

	MSG msg;

	memset(&msg,0,sizeof(msg));


	/*ftok =路徑名字+項目ID*/
	key = ftok("./",2019);//key 

	/*創建或者查找已經存在的,消息隊列,只要有相同的key 
	*就能夠得到同一個消息隊列
	*IPC_CREAT:創建消息隊列
	*IPC_EXCL:檢查隊列消息是否存在
	*/
	msgqid = msgget(key,IPC_CREAT|0666);

	if(msgqid == -1){

			perror("msgget");
			exit(-1);
	}

	/*將信息添加到隊列裏面*/
	
	msg.mtype = 3 ;//消息種類
	 
	printf("send information to lyx :\n");
	gets(msg.mtext);//正文內容

	/*發送信息
	*msg_id:消息隊列標識符
	*&msg:消息結構體地址
	*sizeof(msd)-sizeof(long):消息正文大小
	*0:習慣用0
	*/
	msgsnd(msgqid,&msg,sizeof(msg)-sizeof(long),0);

	printf("\n");


	/*
	msgrcv(msgqid,&msg,sizeof(msg)-sizeof(long),(long)10,0);


	printf("receive information from lyx:\n");
	printf("msg.mtext=%s\n",msg.mtext);


	//刪除消息對列
	//IPC_RMID:刪除標誌位
	msgctl(msgqid,IPC_RMID,NULL);*/
}
int main(){
	
	while(1){

		receive();
		send();

	}
	

	return 0;
	
}
//刪除消息對列
	//IPC_RMID:刪除標誌位
	

	/*memset(&msg,0,sizeof(msg));

	gets(msg.mtext);

	msg.mtype = 10 ;//消息種類

	msgsnd(msgqid,&msg,sizeof(msg)-sizeof(long),0);*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章