




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
移动互联网C语言标准库练习培训系列C语言标准库练习移动互联网第一开发部2009-05-25第1章 前言1. 使用C语言函数库的方法:l 需要关注:函数的功能,入口参数(类型,个数),函数的返回值(正确返回值,错误返回值),有时还需要关注错误码值的含义;l 需要了解:函数声明所在的头文件,功能类似的相关函数;l 必须写测试函数进行熟悉其用法,以及对返回值的判断;l 最重要的是验证此函数满足你的需求;2. 本文档主要介绍进程间通讯(IPC)的基础知识,需要各位在平时搜集资料并多编程了解:l 何谓进程或者线程,如何才能实现多进程;l 进程间通讯常用的“介质”或者常用的方式有哪些;l 进程间是如何利用“介质”进行通讯的;l 进程间通讯“介质”(通讯方式)常用的属性或者特质有哪些;l 什么是守护进程或者精灵进程,它们是如何实现的;l (有待补充)3. 本题库主要是以socket相关题目为主,其它各章节为辅,并辅以snoop抓包练习的路线,主要在socket相关题目中逐渐运用其它技术(如:多进程,信号等知识),并熟练运用;snoop抓包需要了解其使用方法,并能够熟练分析所抓包的各个字段含义等;4. (有待补充)第2章 Socket相关推荐书籍或资料:(资料的具体路径在:10.10.12.126新员工培训电子书)基础资料:Linux C编程一站式学习Linux操作系统下C语言编程入门(有待补充)参考书籍:Linux C函数库详解词典UNIX网络编程(1,2卷)UNIX环境高级编程SunSolaris多线程编程指南(有待补充)2.1 基础篇2.1.1 服务端程序例子/* *gcc -o samp_server samp_server.c -lsocket -lnsl */#include #include #include #include #include #include #include #include #define MYPROT 3490 /*服务器监听端口号*/#define BACKLOG 10 /*最大同时连接请求数*/int main() int sockfd, new_fd; /*监听socket: sockfd, 数据传输socket: new_fd*/ struct sockaddr_in serv_addr; /*本机地址信息*/ struct sockaddr_in clnt_addr; /*客户地址信息*/ int sin_size = 0;int pid = 0;int stat = 0;static unsigned int count;char* sd_str = Hello, MID is a best department of Neusoft!;/*建立网际字节流套接字*/sockfd = socket(AF_INET, SOCK_STREAM, 0); if ( -1 = sockfd ) /*错误检测*/ perror(socketn); exit(1); /*设置socket相关信息*/ serv_addr.sin_family = AF_INET;/*置地址族为AF_INET*/ serv_addr.sin_port = htons(MYPROT); /*如果等于0则随机选择一个端口*/ serv_addr.sin_addr.s_addr = INADDR_ANY; /*系统填入本机IP地址*/ bzero(&serv_addr, sizeof(struct sockaddr_in); /*初始化serv_addr.sin_zero为0*/ /*绑定端口*/stat = bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr); if ( -1 = stat) /*错误检测*/ perror(bindn ); exit(1); /*监听端口*/stat = listen(sockfd, BACKLOG); if (-1 = stat) /*错误检测*/ perror(listenn); exit(1); /*main accept() loop*/ while(1)printf(server%u: Waitting%u .n,getpid(), +count); sin_size = sizeof(struct sockaddr_in); /*接受连接请求,并且建立一个新的Socket描述符*/ new_fd = accept(sockfd,(struct sockaddr *)&clnt_addr,&sin_size); if ( -1 = new_fd ) perror(acceptn); continue; printf(server:got connection form %s, sockfd%un,inet_ntoa(clnt_addr.sin_addr), new_fd); /*子进程代码段*/pid = fork(); if ( pid 0 )perror(“fork error!n”);exit(0);else if(pid = 0) /*如果是使用的UDP,发送数据使用sendto,接收用recvfrom*/stat = send(new_fd, sd_str,strlen(sd_str),0) if ( -1 = stat ) perror(sendn ); close(new_fd); exit(0); printf(Child 关闭sockfd%u!n, new_fd); close(new_fd); elseprintf(Father 关闭sockfd%u!n, new_fd);close(new_fd);waitpid(-1,NULL,WNOHANG); /*等待子进程结束,清除子进程所占用资源*/printf(释放%u资源!n, pid); return 0;2.1.2 客户端程序例子/* * gcc -o samp_client samp_client.c -lsocket -lnsl */#include #include #include #include #include #include #include #include #define PORT 3490#define MAXDATASIZE 100 /*每次最大数据传输量*/int main(int argc, char *argv) int sockfd,numbytes; char bufMAXDATASIZE; struct hostent *he; struct sockaddr_in clnt_addr;int stat = 0; if (argc != 2) fprintf(stderr,usage: client hostnamen); exit(1); he = gethostbyname(argv1); if ( (he = NULL ) perror(gethostbyname); exit(1); /*建立网际字节流套接字*/sockfd = socket(AF_INET, SOCK_STREAM, 0); if ( sockfd = -1 ) perror(socketn); exit(1); /*设置socket相关信息*/ clnt_addr.sin_family = AF_INET; clnt_addr.sin_port = htons(PORT); clnt_addr.sin_addr = *(struct in_addr *)he-h_addr); bzero(&(clnt_addr.sin_zero),8); /*建立连接*/stat = connect(sockfd, (struct sockaddr *)&clnt_addr, sizeof(struct sockaddr); if (-1 = stat) perror(connect); exit(1); /*接收消息*/numbytes = recv(sockfd, buf, MAXDATASIZE, 0); if ( numbytes = -1 ) perror(recv); exit(1); bufnumbytes = 0; printf(Received: %sn,buf); close(sockfd); return 0;2.1.3 练习题1. 编写时间服务器程序(sample_tm_server)(提供的时间格式:”YYYY/MM/DD HH:MM:SS”,例如:2009/04/09 04:58:05)。目的:a) 熟悉C/S架构;b) 能够使用time系列库函数,完成指定格式的日志输出;2. 鹦鹉学舌(multi_parrot):比喻人家怎么说,他也跟着怎么说。这是一个多么有趣的事情啊,我们可不可以完成这样一对“冤家”(parrotc.c和parrots.c)呢,如图1所示,在PC向服务器发送一条Msg后,服务器会给PC返回一条相同的Msg。要求:a) 监听端口的灵活性:服务端监听的端口通过入口参数传入;b) 用户输入的友好性:用户可以通过客户端输入Msg;c) 程序良好的容错性:用户可以根据不同的错误码或错误信息定位错误点;d) 程序退出的优雅性:程序可以优雅的退出;图1:鹦鹉学舌图3. 在“鹦鹉学舌”的基础上,试编写一个“智能机器人”(sample_robot):它能够根据不同的“问”,给出对应的“答”(比如:客户端发送“你好”,此机器人会返回“你好”;“Nice to meet you” -“Nice to meet you too.”等等)。4. 测试程序需要自己编写完成;5. 编写一个简单的信息服务器(sample_info_server),它能够存储客户端发来的用户信息;用户信息至少包括(身份证号码,姓名,年龄,学历,工作年限,工资,手机号码,公司名称,公司地址等)。6. 功能:具有增,删,改,查找即可,其余不限;7. 测试程序需要自己编写完成;8. 想做一个hacker吗?试着编写一个程序(samp_hacker.c),能够查看其它机器指定目录下的文件名字。图2:samp_hacker客户端测试程序需要自己完成;2.2 进阶篇1. 如果sample_robot程序(包括客户端和服务端),在以下步骤中使用命令:netstat -na |grep serv-port(服务端监听端口),看看会有什么不同,尝试查找资料理解并相互讲解。a) 在服务端启动后;b) 在客户端成功登陆后;c) 在对话过程中;d) 在客户端主动断连后;e) 在服务端主动断连后;f) 在e步骤之后,停掉客户端之后;2. “休眠服务器(Dorm_Serv)”(dormancy_serv.c),创建一个“休眠”服务器,使他具有以下功能:a) 用户能够通过网络向Dorm_Serv发出一个休眠指令;b) Dorm_Serv在接收到指令后,能够进入休眠状态;c) Dorm_Serv休眠用户指定的时间后,会向用户发出一个醒来的提示信息;客户端测试程序需要自己完成;3. 根据samp_hacker程序,尝试编写一个”远程控制(Rmte_Cntl)”程序(remote_control.c),其功能如下:a) 能够根据用户从网络发来的指令commands进行相应的操作;b) 能够将指令执行后的结果从网络返回给用户;客户端测试程序需要自己完成;4. “半双工聊天器(HDCQ)”(half_duplex_chat.c)。创建一个简单的半双工聊天程序。“半双工”的意思是指当创建一个连接,服务启动时,只有一个人可以打字,另一个人只有在等到消息通知它输入消息时,才能打字,一旦消息发出去后,需要等到回复才能发送下一条消息,一个人是服务端,一个人是客户端(有点类似于对讲机)。5. 学习“IO的阻塞和非阻塞”相关知识,采用非阻塞IO技术修改HDCQ程序。 6. 学习“I/O多路复用(select)”,并使用此技术完成一个可以为多个客户提供时间的时间服务器程序(io_multi_tm_server),约束条件如sample_tm_server;7. 学习”I/O多路复用(poll)”,并使用此技术完成一个服务器,其功能如下:a) 能够接受客户端C1发来的信息,并把此信息转发给C2;b) 同样,也能够把C2发来的信息转发给C1;8. Sleep是系统提供的一个延时、程序暂停若干秒(unix下是秒,windows下是毫秒)的工具函数,尝试编写一个在unix下实现暂停若干微秒的工具函数(micro_sleep);9. “全双工聊天器(DCQ)”(duplex_chat.c)。根据HDCQ,试设计一个全双工的聊天器,也即:两天人都可以独立的发送和接受消息 (有点类似于QQ,只是局域网内的QQ,或者说是无界面的飞秋) 。需要有设计文档;10. Ok2.3 提高篇此两个题目的目的在于:a) 根据上述学习和练习,提取公用函数;b) 统一日志输出方法;c) 逐步接近网关处理方法;可以用作课下练习使用。1. 完成一个能够同时为多个用户提供信息存储服务的信息服务器(io_multi_info_server),其功能如下:a) 管理员(admin)可以修改、删除其它用户的所有信息资源;b) 各个用户具有:私有信息,共享信息;c) 各个用户(admin除外)之间的私有信息不可以相互访问;d) 各个用户可以查看其它指定用户的共享信息;e) 信息服务器具备数据恢复功能;测试程序自己完成;2. “名字服务器(NS)”.设计并实现一个名字服务器,这个服务器负责维护一个“主机名-端口号对(IP-PORT)”的数据库,以及一个描述这个服务器提供服务的信息。选择一个或则几个服务器SQ(s)到你的NS上“注册”(注意:这些服务器是NS的客户端)。每一个客户端CQ(s)在启动时,不知道它们要求的服务由那台服务器提供,只有在向NS提出服务描述信息后,NS服务器会给CQ(s)返回一个IP-PORT信息,这时CQ(s)可以向合适的服务器发起连接,并获取需要的服务。其流程如图3所示:(其中:SQ(TQ-Serv/TM-Serv)先到NS上注册服务;CQ通过到NS上查询服务,获知SQ信息;再到SQ上使用服务)图3:名字服务器2.4 附加题1. 在NS中,可以加入对常用服务的缓冲;2. 在NS服务器中,增加日志功能,主要记录:谁注册了,谁使用服务了;3. 设计一下NS服务器周期性的对注册服务的SQ(s)进行探测,如果在探测失败后,从服务列表中剔除;此功能有点像114服务,在我们找不到服务的电话号码时,就拨打114进行查询,然后再享用该服务。需要设计报告;第3章 信号相关3.1 基础篇1. 搜集并整理UNIX系统中的常用信号以及各个信号产生时的默认动作;2. 学习信号相关知识,整理常用的系统函数,并使用sigwait以及其他系统调用实现pause;3. 编写一个函数,在用户输入不同符号,能够验证以下操作(至少包含SIGINT,SIGABRT,SIGFPE,其它信号,自己设计):a) 忽略信号SIGINT(ctrl-c);b) 在触发信号SIGABRT(调用abort)时,采用默认的操作;c) 在触发信号SIGFPE(算术错误,如除0操作)时,给用户界面输出一个提示信息;d) 等等;4. ok3.2 进阶篇1. 在“远程控制(Rmte_Cntl)”的基础上增加以下功能:在用户A在客户端键入一个ctrl-c键后,服务端给用户返回一个退出信息,并友好的退出;客户端在获知服务端退出后,也有好的退出;3.3 提高篇第4章 进程相关4.1 基础篇1. 学习fork相关知识,编写一个程序,完成以下功能:a) 创建一个子进程;b) 定义具有不同作用域的变量一些变量;c) 尝试验证如果父进程修改这些变量,子进程是否可见;d) 反过来尝试一下;e) 总结一下,在什么情况下,父子进程才能同时看到该变量的变化;2. 尝试编写程序(fork_sample1.c),完成以下功能:a) 父进程:将一些信息写到文件fock_father.txt中;b) 父进程写入文件的信息每行行首都是一个特殊的字符(例如:a*,b*),能够标识这一行信息;c) 子进程1和子进程2的功能是从fock_father.txt中读取信息,并分别写到文件fock_child1.txt和fock_child2.txt中;d) 子进程1,将行首字符为a的信息放入指定文件中;e) 子进程2,将行首字符为b的信息放入指定文件中;4.2 进阶篇1. 在fork_sample1程序的基础上增加以下两个尝试:a) 父子进程能同时完成各自的操作(父进程在不停的写,子进程在不停的读);b) 在进行多次操作后,尝试比较fock_child1.txt+fock_child2.txt的信息是否就是fock_father.txt中的信息;如果有不同,考虑何以造成信息的不同;4.3 提高篇1. 学习精灵进程或者守护进程相关知识,并尝试编写一个使用此技术的NS服务器;第5章 进程间通讯相关5.1 管道5.1.1 基础篇1. 搜集并整理有关UNIX管道技术的资料,认真理解无名管道和有名管道的优缺点,并掌握各自的使用方法;2. 单机版的鹦鹉学舌(single_parrot.c)。程序至少具备以下功能:a) 进程A负责与用户交互,并将用户输入的信息传递给进程B;b) 进程B负责将进程A传递来的信息输出到用户终端;c) 当进程A 输入信息“quit”后,进程B退出;d) 进程A在进程B退出后,执行释放资源等操作后并退出;e) 采用一种管道机制;5.1.2 进阶篇1. 认真分析附件中的例子:myshell.c2. Ok5.1.3 提高篇5.2 队列5.2.1 基础篇1. 搜集并整理有关UNIX Posix队列和System V队列技术的资料,认真理解并掌握这两种队列技术的使用方法;2. 根据samp_hacker程序,尝试编写一个”远程控制(Rmte_Cntl)”程序(remote_control.c),其功能如下:a) 能够根据用户从网络
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江西省“三新”协同教研共同体2024-2025学年高一上学期12月月考历史试卷(含答案)
- 联合体投标协议书
- 河北石家庄市正中实验中学2024-2025学年高一上学期第一次月考思想政治试卷(含答案)
- 学校运动会部署会上校长讲话-:抓实筹备每一环保障安全每一步成就健康每一人
- 2025秋第二次教学工作推进会上,校长讲话:提质增效,要真抓实做-教学推进会上校长六项发言要点
- 应城交警安全培训中心课件
- 巡察谈话课件
- 岩石变化课件
- 尾矿库安全检查培训课件
- 输液港与PICC的区别
- 质量分析工具-5W1H分析法课件
- 《运动与位置》(31张)-完整版课件
- 五年级上册数学课件-2.1 轴对称 ︳青岛版 (共17张PPT)
- GJB9001C-2017质量管理体系检查内容的内部审核检查表【含检查内容】
- 半导体数字集成电路测试技术概要
- 心包积液以及心包填塞
- 商业银行内部审计技术与方法
- 河道清淤整治工程施工组织设计方案
- 论信息技术对公共行政的影响分析研究行政管理专业
- 技术部薪资等级晋升制度76799
- 生物化学:第2章 核酸的结构与功能
评论
0/150
提交评论