您的位置:首页 > 其它

ipc 消息队列 即时同步聊天通信

2011-05-23 15:27 225 查看
//msgclient.c

#include <stdio.h>

#include <sys/types.h>

#include <sys/msg.h>

#include <sys/ipc.h>

#include <stdlib.h>

#include <string.h>

#define BUF_SIZE 256

#define PATH_NAME "."

#define PROJ_ID 2

struct mymsgbuf

{

long msgtype;

char string[BUF_SIZE];

}msgbuf;

key_t msgkey;

int qid;

int len;

char msg[BUF_SIZE];

void remsg()//接受消息处理

{

len = sizeof(msgbuf)-4;

msgrcv(qid,&msgbuf,len,3,0);//接受消息

if(strncmp("exit",msgbuf.string,4)== 0)//exit 退出聊天

{

printf("server exit!/n");

exit(1);

}

printf("server: %s/n",msgbuf.string);

}

void semsg()//发送消息处理

{

msgbuf.msgtype = 5;//消息类型

printf("client:");

fgets(msg,BUF_SIZE,stdin);

if(strncmp("exit",msg,4)== 0) //exit 退出聊天

{

strcpy(msgbuf.string,msg);

len = sizeof(msgbuf)-4;

msgsnd(qid,&msgbuf,len,0);

exit(1);

}

strcpy(msgbuf.string,msg);

msgsnd(qid,&msgbuf,len,0);//发送消息

}

int main(int argc, char ** argv)

{

if((msgkey=ftok(PATH_NAME, PROJ_ID)) == -1)//获取键值

{

printf("ftok error!/n");

exit (1);

}

if((qid = msgget(msgkey,IPC_CREAT|0660)) == -1)//获取消息id号

{

printf("msgget error !/n");

exit (1);

}

while(1)

{

remsg();

semsg();

}

}

//msgserver.c

#include <stdio.h>

#include <sys/types.h>

#include <sys/msg.h>

#include <sys/ipc.h>

#include <stdlib.h>

#include <string.h>

#define BUF_SIZE 256

#define PATH_NAME "."

#define PROJ_ID 2

struct mymsgbuf

{

long msgtype;

char string[BUF_SIZE];

}msgbuf;

key_t msgkey;

int qid;

int len;

char msg[BUF_SIZE];

void semsg()//发送消息处理

{

msgbuf.msgtype = 3;//消息类型

printf("server:");

fgets(msg,BUF_SIZE,stdin);

if(strncmp("exit",msg,4)== 0)//exit 退出聊天

{

strcpy(msgbuf.string,msg);

len = sizeof(msgbuf)-4;

msgsnd(qid,&msgbuf,len,0);

exit(1);

}

strcpy(msgbuf.string,msg);

len = sizeof(msgbuf)-4;

msgsnd(qid,&msgbuf,len,0); //发送消息

}

void remsg()//接收消息处理

{

msgrcv(qid,&msgbuf,len,5,0);//接收消息

if(strncmp("exit",msgbuf.string,4)== 0)//exit 退出聊天

{

printf("client exit!/n");

exit(1);

}

printf("client: %s/n",msgbuf.string);

}

int main(int argc, char ** argv)

{

if((msgkey=ftok(PATH_NAME, PROJ_ID)) == -1)//获取键值

{

printf("ftok error!/n");

exit (1);

}

if((qid = msgget(msgkey,IPC_CREAT|0660)) == -1)//获取消息id号

{

printf("msgget error !/n");

exit (1);

}

while(1)

{

semsg();

remsg();

}

}

name:5+x

消息队列感觉已经是比较简单的通信了,,学到socket的时候,头疼头疼,,唉.,.,.,.,我自己看着办呗

这程序其实还不完善的,服务端创建的消息队列最后还没有删除,- -!,而且感觉也很臃肿,,应该还可以优化的,这程序只供大家参考参考```

消息队列是先获取键值,再用键值得到消息id号,从而先链表式那样进行发送和接收消息,...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: