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

代码

#include
#include
#include
#include
#include
#include
#include


#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发送消息和接收消息

利用消息队列实现多人聊天_第1张图片

Peter发送消息和接收消息

利用消息队列实现多人聊天_第2张图片

Lucy发送消息和接收消息

利用消息队列实现多人聊天_第3张图片

你可能感兴趣的:(Linux)