免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 880 | 回复: 0
打印 上一主题 下一主题

UNIX网络编程 读书笔记 by qb 6 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-26 13:59 |只看该作者 |倒序浏览
System V消息队列
消息队列是一个消息链表,和FIFO,PIPE不同
1:每个消息是一个记录,被赋予一个优先级,而FIFO和PIPE的机制就表明它是没有优先级可言的,因为First in First out。
2:不需要一定要在写入消息队列的时候一定要有一个消息的接收者,可以过一段时间建立一个消息的接受者,接受该进程的消息。原因是一位消息队列具有随内核的持续性,这个和管道和FIFO不一样,对于一个管道或者FIFO的最后一个关闭发生时,在管道和FIFO上的数据将要被丢弃。
System V消息对垒,内核维护一个定义在头文件中的消息结构:
struct msqid_ds{
struct ipc_perm msg_perm;
struct msg * msg_frist;
struct msg * msg_last;
msglen_t msg_cbytes;
msgqnum_t msg_qnum;
msglen_t  msg_qbytes;
pid_t     msg_lspid;
pid_t     msg_lrpid;
time_t    msg_stime;
time_t    msg_rtime;
time_t    msg_ctime;
}
下面是我自己编译的客户和服务器程序。建立一个服务器,其中一个while(1)的无限循环用来接收数据,等待客户端的连接,我用的是阻塞的方式。当然如书上所叙述的那样,我这个程序有一个重要的问题DOS(denial of service),收到一个客户的连接请求之后,该客户端就永久的占有到他释放链接。
服务器端的代码如下:
#define  _GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define FILE_MODE 0666
#define MY_KEY1 1234L
#define MY_KEY2 2345L
#define MAXMESGDATA 1000
struct mymesg {
long mesg_len;
long mesg_type;
char mesg_data[MAXMESGDATA];
};
int main (void)
{
int    msqid;
struct msqid_ds info;
struct msgbuf buf;
char  buff1[MAXLINE], buff[MAXLINE];
pid_t pid;
struct mymesg my_mesg;
msqid  = msgget(MY_KEY1, 0666|IPC_CREAT);
while(1){
my_mesg.mesg_type = 1;
msgrcv(msqid,&(my_mesg.mesg_type), MAXLINE, my_mesg.mesg_type, 0);
pid = atol(my_mesg.mesg_data);
printf("The child pid= %ld\n",pid);
my_mesg.mesg_type = pid;
snprintf(my_mesg.mesg_data,MAXMESGDATA,"Child pid %ld",(long)pid);
my_mesg.mesg_len = strlen(my_mesg.mesg_data);
msgsnd(msqid, &(my_mesg.mesg_type), my_mesg.mesg_len,0);
}
exit(0);
}//END
以上是我的服务器代码,可以运行,不用运行于后台,直接可以前台运行,然后阻塞,接收到一个客户端的请求之后把客户端的请求返回给客户端,并且自己打印出客户端的id。建议把它保存为server.c
编译:cc server.c - server
   下面是客户端的代码:
#define  _GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define FILE_MODE 0666
#define MY_KEY1 1234L
#define MY_KEY2 2345L
#define MAXMESGDATA 1000
struct mymesg {
long mesg_len;
long mesg_type;
char mesg_data[MAXMESGDATA];
};
int main (void)
{
int     msqid=32768;
struct msqid_ds info;
struct msgbuf buf;
struct mymesg my_mesg;
pid_t  pid;
msqid = msgget(MY_KEY1,0666|IPC_CREAT);
pid   = getpid();
my_mesg.mesg_type  = 1;
snprintf(my_mesg.mesg_data,MAXMESGDATA,"%ld",(long)pid);
my_mesg.mesg_len =  strlen(my_mesg.mesg_data);

msgsnd(msqid, &(my_mesg.mesg_type), my_mesg.mesg_len,0);
msgrcv(msqid, &(my_mesg.mesg_type),MAXLINE, pid,0);
printf("%s\n", my_mesg.mesg_data);
exit(0);
}//END
    以上是我的客户端的程序,可以通过编译,并且运行成功。建议保存:client.c
然后编译:
        cc client.c -o client
    开启两个终端,一个运行服务器
                ./server
                 一个运行客户端。
                ./client
    改程序会服务器现实进程id,并且送回客户端,并且在客户端解析出来之后,显示进程id。
    以上两个要注意的我的linux转述,必须加上 #define _GNU_SOURCE 这个头文件才能编译成功,具体要看一下网上的评说了,其实我也是照着google一把的结果做的。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83146/showart_1335547.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP