您的位置:首页 > 其它

用消息队列编写一个客户端服务器通信的程序

2011-09-20 14:51 776 查看
实验原理:

本实验用消息队列设计一个简易的双人聊天程序(一个服务器,两个客户端)。消息队列重点在于消息类型的匹配,客户端和服务端的“通信协议”的设计。思想如下:

服务器端:接受客户端发来的任何消息,并根据器消息类型,转发给对应的客户端。同时,检测是否有退出标记,有则给所有的客户端发送退出标记,等待1s后,确定客户端都退出,删除消息队列,释放空间,并退出。

客户端:A和B。A给B发送信息,先发给服务器,由服务器根据自定义协议转发该消息给B。同时B也可以通过服务器给A发消息

服务器:

#include<stdio.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

#include<string.h>

#define KEY_MSG 0x101

#define MSGSIZE 64

typedef struct

{

long mtype;

char mtext[MSGSIZE];

}msgbuf;

#define LEN sizeof(msgbuf)-sizeof(long)

void main()

{

int msgid;

msgbuf buf1,buf2;

msgid=msgget(KEY_MSG,IPC_CREAT|0666);

while(1)

{

msgrcv(msgid,&buf1,LEN,1L,0);

printf("Receive client1 message:%s\n",buf1.mtext);

if(buf1.mtext[0]=='x' || buf1.mtext[0]=='X')

{

strcpy(buf1.mtext,"x");

buf1.mtype=3L;

msgsnd(msgid,&buf1,LEN,0);

buf1.mtype=4L;

msgsnd(msgid,&buf1,LEN,0);

break;

}

buf1.mtype=4L;

msgsnd(msgid,&buf1,LEN,0);

msgrcv(msgid,&buf2,LEN,2L,0);

printf("Receive client2 message:%s\n",buf2.mtext);

if(buf2.mtext[0]=='x' || buf2.mtext[0]=='X')

{

strcpy(buf2.mtext,"x");

buf2.mtype=3L;

msgsnd(msgid,&buf2,LEN,0);

buf2.mtype=4L;

msgsnd(msgid,&buf2,LEN,0);

break;

}

buf2.mtype=3L;

msgsnd(msgid,&buf2,LEN,0);

}

sleep(1);

msgctl(msgid,IPC_RMID,NULL);

}

客户端1:

#include<stdio.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

#include<string.h>

#define KEY_MSG 0x101

#define MSGSIZE 64

typedef struct

{

long mtype;

char mtext[MSGSIZE];

}msgbuf;

#define LEN sizeof(msgbuf)-sizeof(long)

void main()

{

int msgid;

msgbuf buf1,buf2;

msgid=msgget(KEY_MSG,0666);

while(1)

{

printf("Input the mag to client2");

gets(buf1.mtext);

buf1.mtype=1L;

msgsnd(msgid,&buf1,LEN,0);

msgrcv(msgid,&buf2,LEN,3L,0);

if(buf2.mtext[0]=='x'||buf2.mtext[0]=='X')

{

printf("client1 will quit\n");

break;

printf("Recevie from client2,message:%s\n",buf2.mtext);

}

}

}

客户端2:

#include<stdio.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

#include<string.h>

#define KEY_MSG 0x101

#define MSGSIZE 64

typedef struct

{

long mtype;

char mtext[MSGSIZE];

}msgbuf;

#define LEN sizeof(msgbuf)-sizeof(long)

void main()

{

int msgid;

msgbuf buf1,buf2;

msgid=msgget(KEY_MSG,0666);

while(1)

{

msgrcv(msgid,&buf2,LEN,4L,0);

if(buf2.mtext[0]=='x'||buf2.mtext[0]=='X')

{

printf("client2 will quit!\n");

break;

}

else printf("Receive from client1,message:%s\n",buf2.mtext);

sleep(1);

printf("Input the msg to clinet1:");

gets(buf1.mtext);

buf1.mtype=2L;

msgsnd(msgid,&buf1,LEN,0);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐