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号,从而先链表式那样进行发送和接收消息,...
相关文章推荐
- IPC—进程间的通信(信号量,共享内存,消息队列)
- IPC之消息队列·即时通讯小程序(一) 推荐
- 【IPC通信】Posix消息队列的属性设置
- 【VxWorks系列】任务间同步与通信之消息队列
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- Linux — IPC进程通信之消息队列详解
- IPC通信:Posix消息队列
- 进程通信 IPC 之消息队列
- IPC通信之消息队列、信号量和共享内存
- linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存
- 笔记六:进程间的通信(IPC通信之消息队列)
- IPC通信:Posix消息队列读,写
- Liunx进程间IPC通信—消息队列
- IPC通信:Posix消息队列的创建,关闭,删除
- Linux C 进程间的IPC通信 之 消息队列(1)
- IPC通信:Posix消息队列
- IPC通信:Posix消息队列读,写
- 【Linux】IPC通信之消息队列
- IPC通信:Posix消息队列的属性设置
- uc笔记09---进程通信,管道,进程间通信,共享内存,消息队列,信号量,IPC 命令