




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计报告题目: ipc机制 班级: 计算机2009-2、3班 学号: 200901051718 200901051626 姓名: 指导老师: 完成起止日期:2011年 12 月 18 日 2011 年 12 月 23 日目录0、目录 11、课程设计题目与要求 22、设计思想与系统结构 34、代码分析 85、课程设计总结 22课程设计题目与要求题目:linux ipc机制设计要求:搭建一个服务器,该服务器采用不同的响应方式,可以支持30个以下,或者100个以上的不同客户的访问.l 基于socekt的服务器构建l 阻塞/非阻塞方式l 线程和进程方式测试要求: l 客户端/服务器端的响应速度l 服务器端占用的内存设计思想与系统结构设计思想:此课程设计共以两种方式实现了服务器端,即分别以线程调用和进程调用响应客户端请求的方式设计了服务器端。用两种方式实现了客户端,即使用阻塞和非阻塞的方式设计客户端。系统结构:1、线程调用的方式实现服务器端结构如下:流程图如下:(见下页)2、进程程调用的方式实现服务器端结构如下:流程图如下:2、以阻塞的方式实现客户端的读写操作流程图如下:(见下页)4、以非阻塞的方式实现客户端的读写操作流程图如下:代码分析此模块列出了两个服务器的代码和两个客户端的代码1、用进程机制设计服务器端server_process.c/* * file: server_process.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #include #define server_port 6666 / 预先指定服务器的服务端口#define length_of_listen_queue 10 / 监听的最大请求数#define buffer_size 255 intmain (int argc, char* argv) int i = 0; int servfd, clifd; struct sockaddr_in servaddr, cliaddr; if (servfd = socket (af_inet, sock_stream, 0 ) 0 ) printf ( 创建socket失败!n );exit ( 1 ); bzero ( & servaddr, sizeof (servaddr); servaddr.sin_family = af_inet; servaddr.sin_port = htons (server_port); servaddr.sin_addr.s_addr = htons (inaddr_any); if (bind (servfd, ( struct sockaddr * ) & servaddr, sizeof (servaddr) 0 ) printf ( 绑定到端口: %d 失败!n , server_port);exit ( 1 ); if (listen (servfd, length_of_listen_queue) 0 ) printf ( 服务器监听失败!n );exit ( 1 ); for (i = 0; i 10; i+) char bufbuffer_size;long timestamp;socklen_t length = sizeof (cliaddr);clifd = accept (servfd, ( struct sockaddr * ) & cliaddr, & length);if (clifd 0 ) printf ( 开始接收请求时出错!n ); break ;if (!fork () printf ( 收到客户端请求ip为:%s,port:%dn , inet_ntoa (cliaddr.sin_addr), ntohs (cliaddr.sin_port); timestamp = time (null); strcpy (buf, 服务器受到你的信息!来自服务器,时间:); strcat (buf, ctime ( & timestamp); send (clifd, buf, buffer_size, 0 ); close (clifd); sleep (5); printf (我是进程 %d ,我已经关闭!n, i); exit (0); /此处是关闭进程,而不是关闭整个程序 / exit close (servfd); return 0 ;2、用线程机制设计服务器端server_thread.c/* * file: client_thread.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #include #include#include#define server_port 6666 / 预先指定服务器端口#define length_of_listen_queue 10 / 限定监听的最大请求数 #define buffer_size 255 static pthread_mutex_t mutex = pthread_mutex_initializer;static pthread_cond_t cond = pthread_cond_initializer;char bufbuffer_size;long timestamp;int i;int servfd, clifd;struct sockaddr_in servaddr, cliaddr;pthread_t tid;void*dealing_thread (void* arg) printf (enter threadn); printf ( 来自客户端:%s 端口:%dn , inet_ntoa (cliaddr.sin_addr), ntohs (cliaddr.sin_port); timestamp = time (null); pthread_mutex_lock (&mutex); /锁上全局变量 strcpy (buf, 服务器收到你的信息!来自服务器,时间:); strcat (buf, ctime ( & timestamp); send (clifd, buf, buffer_size, 0 ); close (clifd); pthread_mutex_unlock (&mutex); /解锁 sleep(5); printf (我是线程程 %d ,我已经关闭!n, i); printf (leave threadn); pthread_exit (0);int main (int argc, char* argv) if (servfd = socket (af_inet, sock_stream, 0 ) 0 ) printf ( 创建socket失败!n ); exit ( 1 ); bzero ( & servaddr, sizeof (servaddr); servaddr.sin_family = af_inet; servaddr.sin_port = htons (server_port); servaddr.sin_addr.s_addr = htons (inaddr_any); if (bind (servfd, ( struct sockaddr * ) & servaddr, sizeof (servaddr) 0 ) printf ( 绑定到端口:%d 失败n , server_port); exit ( 1 ); if (listen (servfd, length_of_listen_queue) 0 ) printf ( 开始监听失败!n ); exit ( 1 ); for (i = 0; i 10; i+) socklen_t length = sizeof (cliaddr); clifd = accept (servfd, ( struct sockaddr * ) & cliaddr, & length); if (clifd 0 ) printf ( 运行出错!!n ); break ; printf (运行的此处!n); int ret = pthread_create (&tid, null, (void *) dealing_thread , null); if (ret != 0) printf (%s: %dn, _func_, strerror (ret); / exit close (servfd); return 0 ;3、用阻塞方式设计客户端client_block.c/* * file: client_block.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #define server_port 6666 / 预先指定服务器端口#define buffer_size 255 #define reuqest_message 欢迎连接服务器!n void using (char* name) printf ( 用法: %s ipaddrn , name);int main (int argc, char* argv) int servfd, clifd, length = 0; struct sockaddr_in servaddr, cliaddr; socklen_t socklen = sizeof (servaddr); char bufbuffer_size; if (argc 2 ) using (argv 0 ); exit ( 1 ); if (clifd = socket (af_inet, sock_stream, 0 ) 0 ) printf ( 创建socket失败!n ); exit ( 1 ); srand (time (null); bzero ( & servaddr, sizeof (servaddr); servaddr.sin_family = af_inet; if ( inet_aton (argv 1 , & servaddr.sin_addr) = 0) printf (“错误!”); exit (0); servaddr.sin_port = htons (server_port); if (connect (clifd, ( struct sockaddr * ) & servaddr, socklen) 0 ) printf ( 不能链接到服务器: %s!n , argv 1 ); exit ( 1 ); length = recv (clifd, buf, buffer_size, 0); if (length 0) printf ( 当从服务器:%s! 获取数据是出错 , argv1 ); exit ( 1 ); printf ( 来自ip: %s :nt%s, argv1, buf); close (clifd); return 0;4、用非阻塞方式设计客户端client_nonblock.c/* * file: client_nonblock.c * author: root * * created on 2011年12月23日, 下午4:24 */#include #include #include #include #include #include #include #include #include #include #include #include #include #include int setnonblocking (int sockfd) if (fcntl (sockfd, f_setfl, fcntl (sockfd, f_getfd, 0) | o_nonblock) = -1) return -1; /假如设置非阻塞失败返回-1 return 0; /假如设置非阻塞成功返回0unsigned long name_resolve (char *host_name) /将ip地址解析成网络地址 struct in_addr addr; struct hostent *host_ent; if (addr.s_addr = inet_addr (host_name) = (unsigned) - 1) host_ent = gethostbyname (host_name); if (host_ent = null) return (-1); memcpy (host_ent-h_addr, (char *) &addr.s_addr, host_ent-h_length); return (addr.s_addr);int connectserver (char *address, int port) int client_id; /定义socket返回的id struct sockaddr_in sin; /定义服务器 地址结构体 if ( client_id = socket (af_inet, sock_stream, 0) = -1) perror (创建socket失败!r); return -1; bzero ( & sin, sizeof (sin); /全部赋值为零 sin.sin_family = af_inet; /进行简单的设置 sin.sin_port = htons (port); sin.sin_addr.s_addr = name_resolve (address); if (sin.sin_addr.s_addr = null) return (-1); printf (ip: %sn, inet_ntoa (sin.sin_addr); if ( connect (client_id, (struct sockaddr *) &sin, sizeof (sin) 0) /假如连接失败,则返回-1 printf (connect error!n); return (-1); if (setnonblocking (client_id) = -1) return -1; return client_id;int main (void) /测试函数 fd_set read_flags, write_flags; struct timeval waitd; int connectedid; char outbuff512; /定义写的字符数组 char inbuff512; /定义读取的字符数组 int state; /定义现在有误读或写数据的状态 memset (&outbuff, 0, sizeof (outbuff); /全部赋值为零 connectedid = connectserver (192.168.136.105, 6666); / 连接服务器 if (connectedid = -1) printf (不能连接到服务器!n); exit (0); strcat (outbuff, hello/n); /把此字符串连接到outbuff 上 /buffer while (1) waitd.tv_sec = 1; / 设置等待的时间为1秒 waitd.tv_usec = 1; / 设置等待的时间为1秒 fd_zero (&read_flags); /赋值为零以备使用 fd_zero (&write_flags); /赋值为零以备使用 fd_set (connectedid, &read_flags); if (strlen (outbuff) != 0) fd_set (connectedid, &write_flags); state = select (connectedid + 1, &read_flags, &write_flags, (fd_set*) 0, &waitd); if (state 0) /判断当前是否有数据读或写 printf (暂无数据接收n); sleep (1); else if (fd_isset (connectedid, &write_flags) /假如当前可写 /socket准备写 fd_clr (connectedid, &write_flags); write (connectedid, outbuff, strlen (outbuff); memset (&outbuff, 0, sizeof (outbuff); if (fd_isset (connectedid, &read_flags) /假如当前可读 /socket准备读取 fd_clr (conn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国土地一级开发项目创业计划书
- 中国红外气血循环机项目创业计划书
- 中国核桃深加工项目创业计划书
- 中国家庭信息机项目创业计划书
- 中国鸡饲养项目创业计划书
- 中国CAD软件项目创业计划书
- 中国肉牛养殖加工项目创业计划书
- 中国急救药箱项目创业计划书
- 中国观赏树木项目创业计划书
- 2025建筑工程劳务分包(清包工)合同
- 50097马工程-国际组织(第二版)全套课件
- 数字电子技术基础(第六版)阎石版课后答案课后题答案与解析课后习题答案
- 自身免疫性脑炎
- 项目部用印台账
- 体育与健康人教版三年级上册前滚翻教案
- GB 38454-2019 坠落防护 水平生命线装置
- 2022年北京市西城区八年级下学期期末语文试卷
- 中班绘本《跑跑镇》微课件
- 基于岗位拓展模型和KPI的主基二元考核绩效体系的构建
- 初三英语毕业考试补考试卷
- 消防安全工作台账表格汇总
评论
0/150
提交评论