利用消息队列实现多人聊天

代码
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>


#ifdef L
#define M 'L'  //接收消息的类型    ASCII码 
char writer[]="Lucy" ; //给Lucy发送消息必须发送L类型
#endif

#ifdef B
#define M 'B'
char writer[]="Bob" ; //给Bob发送消息必须发送B类型
#endif

#ifdef P
#define M 'P'
char writer[]="Peter" ; //给Peter发送消息必须发送P类型
#endif

typedef struct msg_my {
	long mytype ;   //用来存储消息的类型
	char name[20];  //用来存储发送者的名字
	char mtext[100];   //用来存储真正要发送的内容
} MSG;


int main(int argc ,char **argv) {
	char buffer[120]=""; //缓冲区,存储发送的内容
	int msgid;
	MSG msg;


	key_t key;
	key=ftok(".",0xFF);//产生一个唯一key值
	if((msgid=msgget(key,IPC_CREAT|0666))<0) { //创建消息队列
		perror("msgid");
		exit(1);
	}
	pid_t pid;
	pid=fork();
	if(pid<0) {
		perror("fork");
	} else if(pid==0)
		//创建子进程,子进程负责发送消息
	{
		while(1) {
			//检测键盘,组织数据,发送消息到消息队列

			printf("\r%s:",writer); //打印发送人提示
			fflush(stdout);  //打印到屏幕上
			fgets(buffer,sizeof(buffer),stdin); //从键盘读取字符串
			buffer[strlen(buffer)-1]='\0'; //回车符号转化为终结符
			//printf("%s",buffer);
			//if(!strncmp(buffer,"bye",3))break;

			if(buffer[0]=='L'||buffer[0]=='B'||buffer[0]=='P') { //如果发送消息的类型为这三种才把消息发送到消息队列
				msg.mytype=(long)buffer[0]; //消息类型
				strcpy(msg.name,writer);//消息的发送者
				strcpy(msg.mtext,buffer); //消息正文
				msgsnd(msgid,&msg,sizeof(msg)-sizeof(long),0); //默认阻塞等待消息发送到消息队列
			}


		}


	} else { //父进程负责接收消息
		//从消息队列种,按照 "我” 消息类型接收消息
		while(1) {
			//只接受自己名字首字母大写类型的消息。
			msgrcv(msgid,&msg,sizeof(msg)-sizeof(long),(long)(M),0);
			printf("\r message from %s: %s\n",msg.name,msg.mtext);
			printf("\r %s:",writer);
			fflush(stdout);

		}


	}

	return 0;
}
Makefile文件
all:6.1.c
	gcc 6.1.c -o lucy -DL
	gcc 6.1.c -o bob -DB
	gcc 6.1.c -o peter -DP
clean:
	rm lucy bob peter -f
运行结果(通过发送的消息首字母大写来判别消息发送给谁)
Bob发送消息和接收消息

在这里插入图片描述

Peter发送消息和接收消息

在这里插入图片描述

Lucy发送消息和接收消息

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值