




已阅读5页,还剩80页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件开发实习讲义,提纲,实验题目及要求 技术一:Socket网络编程; 技术二:软件开发文档编写规范; 技术三:统一建模语言UML; 技术四:Rational Rose工具与UML; 技术五:开发环境;,提纲,实验题目及要求 技术一:Socket网络编程; 技术二:软件开发文档编写规范; 技术三:统一建模语言UML; 技术四:Rational Rose工具与UML; 技术五:开发环境;,实验题目及要求,【实验题目】基于客户端/服务器模型的软件开发 【题目概述与总体要求】 题目概述:设计一个XXX网络应用程序。 总体要求:按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序;提交需求分析、概要设计、详细设计文档以及UML设计文件(其中包括用例图,类图,状态图,部署图)。建议客户端和服务器的设计都使用可视化界面,在界面中加入相应的功能按钮或菜单,便于操作和演示。,实验题目及要求,【题目具体要求】 客户端根据指定的ip地址和端口号连接到服务器; 客户端可以断开和服务器的连接; 服务器可以选定某个已登录的客户端,断开与其的连接; 客户端可以向服务器发送文字信息; 服务器要能显示所有登录客户端的ip地址、端口号信息等: 服务器上需要显示客户端登录和断开的提示信息; 服务器显示所有登录客户端所发送的文字信息、数目,及对应的客户端信息,标识该文字信息是哪个客户端发送; 服务器能够从所有接收到文字信息中,筛选从某个登录客户端发送的文字信息和数目。 客户端可以显示服务器发送的文字信息及其数目; 服务器可以选定某个已登录的客户端,向其发送文字信息; 客户端可以向服务器发送文件。 服务器显示客户端发送的文件数和当前发送的文件及对应客户端信息。 15必须实现,67为加分需求,89选作。,实验题目及要求,【编程提示】 开发环境和编程语言可自由选择; 服务器设计一种数据结构来维护每一个客户端的信息,包括socket,IP地址,端口号、收到文字信息的数目,文字信息,其中的文字信息应该设计成另一个数据结构用来存储一个个文字信息,包括文字字符串、字符串长度。如果能使用数据库存储,当然更好。 本题目中要求实现的功能较多,为了更好的开发调试,可以将上一个功能实现并测试成功后,再实现其他功能。 用表单显示信息。,实验题目及要求,【实验步骤】 根据题目,撰写需求分析、概要设计、详细设计文档; 根据需求,利用Rational Rose工具设计UML建模图(用例图、类图、状态图、部署图); 根据UML建模图在开发环境中进行软件开发; 实现功能15,并进行调试与测试; 实现功能67,并进行调试与测试; 有时间的同学可以实现功能89; 提交程序源代码及文档(包括设计文档和UML图); 编写实验报告,实习结束后1周内由班长交齐。,实验题目及要求,【实验报告内容】 题目要求的所有文档和设计图; 设计的思路和关键数据结构; 测试数据,包括对于异常情况的处理; 软件使用说明书; 在设计、实现和测试中发现的问题及解决方案; 软件开发实习总结。 【实验上机要求】 开放式上机; 第二周的周六、周日集中验收。,提纲,实验题目及要求 技术一:Socket网络编程; 技术二:软件开发文档编写规范; 技术三:统一建模语言UML; 技术四:Rational Rose工具与UML; 技术五:开发环境;,网络编程模型,基于有连接网络程序的执行过程 服务程序启动 客户程序启动 客户端与服务器建立连接 客户端发送请求 服务器处理请求,返回响应 服务器断开连接,等待下一个请求,网络编程模型,基于TCP编程模型,主要内容,创建网络端点socket 连接服务器connect 绑定服务器地址和端口bind 监听端口listen 接受客户端连接accept 关闭socketclose 接收和发送数据read、write,网络编程模型,基于TCP编程模型,基于TCP编程模型,什么是套接字,创建网络端点socket, /1.创建网络端点 int sockfd=socket(AF_INET, SOCK_STREAM, 0); if(sockfd=-1) printf(“can;t create socketn“); exit(1); ,创建网络端点socket,创建网络端点socket,socket(套接字) 网络传输的端节点 支持多种协议 UNIX、INET、IPX 支持多种类型 流式(STREAM) 数据报(DGRAM) 原始(RAW),创建网络端点socket,int socket (int family, int type, int protocol) 功能:创建socket描述符 参数: family(协议簇):AF_INET、AF_UNIX type(类型):SOCK_STREAM、SOCK_DGRAM、SOCK_RAW protocol(协议):默认为0 返回值:0socket描述符, -1失败, 系统全局变量errno为错误代码,创建网络端点socket,socket数据结构,socket地址,socket地址 Linux采用通用socket地址兼容各种协议 UNIX INET ,通用的地址结构: struct sockaddr /*地址类型AF_xxx*/ u_short sa_family; /*协议地址,不同的协议地址格式不同*/ char sa_data14; ;,socket地址,TCP/IP协议的socket地址,struct sockaddr_in short sin_family; /*AF_INET*/ u_short sin_port; /*端口号,网络字节顺序*/ struct in_addr sin_addr; /*IP地址,网络字节顺序*/ char sin_zero8; /*填充字节,必须为全零*/ ;,struct in_addr union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S_addr; S_un; ;,socket地址,TCP/IP协议的socket地址 常用地址形式(字符串):“127.0.0.1” 地址转换函数 inet_aton(const char *cp,struct in_addr *inp); char* inet_ntoa(struct in_addr in);,/字符串形式地址转换为网络地址形式 struct sockaddr_in addr; inet_aton(“219.245.78.159”,字节顺序,主机字节顺序(以16位整数0xA130为例) little-endian顺序 低字节在前 Intel处理器使用little-endian big-endian顺序 高字节在前 sun工作站使用big-endian顺序,字节顺序,网络字节顺序 统一表示方式 采用big-endian顺序 主机字节顺序和网络字节顺序的转换 unsigned short int htons(unsigned short int hostshort) unsigned long int htonl(unsigned long int hotlong) unsigned short int ntohs(unsigned short int netshort) unsigned long int ntohl(unsigned long int netlong),socket地址, /指定服务器地址 struct sockaddr_in srvaddr; bzero( ,基于TCP编程模型,绑定服务器地址和端口,int bind(int sockfd,struct sockaddr *myaddr,int addrlen); 功能:绑定本地地址和端口 参数: sockfdsocket描述符 myaddr自己的地址 addrlen地址结构长度 返回值: 0成功,-1失败,errno为错误代码,绑定服务器地址和端口,int bind(int sockfd,struct sockaddr *myaddr,int addrlen); 说明 服务器和客户端都可以绑定socket地址,但通常客户端不需要绑定自己的socket地址。 不绑定地址时系统自动分配一个端口,并用该端口和本机ip地址填充客户端socket地址. 注意INADDR_ANY,绑定服务器地址和端口, /绑定服务器地址和端口 if( bind(sockfd, (struct sockaddr *) ,绑定服务器地址和端口,INADDR_ANY 绑定任何网络设备接口,适合于多IP主机 对于IP地址经常变化的情况也适用,struct sockaddr_in srvaddr; srvaddr.sin_addr.s_addr=htonl(INADDR_ANY); ,基于TCP编程模型,基于TCP编程模型,如何标识一个连接: IP地址 + 端口号,连接服务器,int connect(int sockfd,struct sockaddr *servaddr,int addrlen) 功能:连接服务器 参数: sockfdsocket描述符 servaddr服务器地址 addrlen地址结构长度 返回值: 0成功,-1失败,errno为错误代码,连接服务器,int connect(int sockfd,struct sockaddr *servaddr,int addrlen) 说明: 对一个socket描述符不能两次使用connect函数,int sockfd=socket(); connect(sockfd,); connect(sockfd,);,连接服务器, /连接服务器 if( connect(sockfd, (struct sockaddr *) ,基于TCP编程模型,监听端口,int listen(int sockfd,int backlog) 功能:监听本地地址和端口 参数: sockfd已绑定的socket描述符 backlog以完成连接,等待接受的队列长度 返回值 0成功,-1失败,errno为错误代码,监听端口,int listen(int sockfd,int backlog) 说明 执行listen函数后socket转换成被动socket,可以接受连接, TCP协议为每个侦听socket维护两个队列:未完成连接队列和已完成连接队列, backlog指定已完成连接队列的最大长度,监听端口, / 监听端口 if( listen(sockfd,BACKLOG) =-1) printf(“listen errorn“); exit(1); ,基于TCP编程模型,接受客户端连接,int accept(int sockfd,struct sockaddr *clientaddr,int addrlen); 功能:接受连接 参数: sockfdsocket描述符 clientaddr客户端地址 addrlen地址结构长度 返回值 0成功,返回新的socket描述符标识已接受的连接 , -1失败,errno为错误代码,接受客户端连接,int accept(int sockfd,struct sockaddr *clientaddr,int addrlen); 说明 accept函数返回的socket描述符是真正可以和客户端通信的socket,服务器的侦听socket只接受连接,不能用于通信 accept函数在没有已完成的连接时将阻塞进程,接受客户端连接, /接受客户端连接 int sin_size=sizeof(struct sockaddr_in); int new_fd= accept(sockfd, (struct sockaddr *) ,基于TCP编程模型,接收数据,int read(int fd,char *buf,int len); 功能:从socket读取数据 参数: fdsocket描述符 buf接收数据缓冲区 len要读取数据大小 返回值 n0 and n=len 读出n个字节 n=0 读通道已关闭 n0 出错或异常,errno为错误代码 阻塞过程中收到中断信号,返回EINTR,读取完整数据的read_all函数 int read_all(int fd,char* buf,int nBytes); for(;) rc=read(fd,buf,nBytes); if(rc0) /读出rc个字节 return rc; else if (rc=0) /读通道已关闭 close(fd); return 0; else if(errno=EINTR) else printf(stderr,“Read error”); close(fd); return -1; / for ,基于TCP编程模型,发送数据,int write(int fd,char *buf,int len); 功能:从socket读取数据 参数: fdsocket描述符 buf发送数据缓冲区 len要发送数据大小 返回值 0成功,-1失败,errno为错误代码,发送数据,int write(int fd,char *buf,int len); 说明 系统发送缓冲区中空间大于参数len时返回len 发送缓冲区中空间小于参数len时write函数阻塞 write函数阻塞时可能因为下列原因返回 发送缓冲区中空间大于参数len 连接被复位,返回错误 阻塞过程中收到中断信号,返回EINTR write_all函数,int write_all(int fd,char* buf,int nBytes); for(;) wc=write(sockfd,buf, nBytes); if(wc0) return wc; else if(errno=EINTR) /收到中断信号 else printf(stderr,“Write error”); close(sockfd); return -1; /for ,关闭socket,int close(int sockfd) 功能:关闭socket 参数: sockfdsocket描述符 返回值 0成功,-1失败,errno为错误代码 说明 调用close只是将对sockfd的引用减1,直到对sockfd的引用为0时才清除sockfd ,TCP协议将继续使用sockfd,直到所有数据发送完成,必须的头文件,#include #include #include #include #include #include ,主要内容,UDP Socket编程 原始socket编程,UDP Socket编程,UDP socket编程模型,UDP Socket编程,int recvfrom(int sockfd,void *buf,int len,unsigned char flags,struct socketaddr *from,socklen_t *addrlen); 功能:接收UDP数据包 参数: 前4个参数和recv相同 from发送者socket地址,NULL表示不需要 addrlensocket地址长度,from为NULL时必须置为NULL 返回值:=0成功,-1失败,UDP Socket编程,recvfrom函数 说明: UDP协议给每个UDP SOCKET设置一个接收缓冲区,每一个收到的数据报根据其端口放在不同缓冲区。 recvfrom函数每次从接收缓冲区队列取回一个数据报,没有数据报时将阻塞,返回值为0表示收到长度为0的空数据报,不表示对方已结束发送,UDP Socket编程,int sendto(int sockfd,const void *buf,int len,unsigned char flags,struct socketaddr *to,int tolen); 功能:发送UDP数据包 参数: 前4个参数和send相同 to接收者socket地址 addrlensocket地址长度 返回值:=0成功,-1失败,UDP Socket编程,sendto函数 说明: 每次调用sendto都必须指明接收方socket地址,UDP协议没有设置发送缓冲区,sendto将数据报拷贝到系统缓冲区后返回,通常不会阻塞 允许发送空数据报,此时sendto返回值为0,UDP Socket编程,UDP服务器示例 UDP服务器特点 服务器不接受客户端连接,只需监听端口 循环服务器,可以交替处理各个客户端数据包,不会被一个客户端独占,UDP Socket编程,udp客户端特点 客户端不用建立连接,第一次调用sendto函数时,UDP协议为这个UDP socket选择一个端口号,以后的发送和接收操作均使用这个端口号 客户端可以接收来自任何主机的数据报 客户端可能永远阻塞(服务器主机崩溃),UDP Socket编程,有连接的udp socket 在udp socket上调用connect函数,但不会产生3次握手过程,只记录连接另一方的IP和端口,connect函数立即返回 特点: 发送UDP数据报时不用指定服务器地址 只能接收来自指定服务器的数据报,UDP Socket编程,有连接的udp socket 错误返回情况 数据报成功到达服务器,但服务器接收缓冲区已满,丢弃该数据报,不返回错误 数据报成功到达服务器,但服务器并没有在该端口上提供服务,UDP协议丢弃数据报返回ICMP错误消息,客户端主机接收到这个ICMP消息后将以异步方式向客户端返回一个ECONNRESET错误,UDP Socket编程,有连接的udp socket 断开有连接的udp socket udp socket允许对一个socket多次调用connect函数,每次调用connect函数将释放原来绑定的地址,绑定到新地址 利用connect函数绑定一个特殊地址可以断开之前的udp连接,struct sockaddr_in addr; addr.sin_family=AF_UNSPEC; . connect(sockfd,(struct sockaddr *),UDP Socket编程,使用UDP Socket的说明 UDP协议不保证数据报可靠到达 用超时和重发机制处理丢失的数据报 用数据报序列号区分重复数据报 UDP协议不保证数据报顺序到达 UDP协议没有流量控制 可以由程序维护一个发送缓冲区,将数据报保存在该缓冲区,直到收到确认才清除,当用户缓冲区满时不再发送数据报,原始socket编程,概述 TCP和UDP Socket对TCP和UDP协议做了封装,简化了编程接口,但失去了对IP数据包操作的灵活性 原始socket直接针对IP数据包编程,具有更强的灵活性,能够访问ICMP和IGMP数据包 可以编写基于IP协议的高层协议,原始socket编程,创建原始socket int socket (int family, int type, int protocol) 参数: familyAF_INET typeSOCK_RAW protocol IPPROTO_ICMPICMP数据包 IPPROTO_IGMPIGMP数据包 IPPROTO_IPIP数据包,原始socket编程,设置IP选项 是否自动填充IP首部 on=0,由协议自动填充 on=1,用户程序填充,int on=1; setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on),原始socket编程,绑定本地IP地址 使用bind函数绑定本地IP地址 发送的IP数据包的源地址就是bind绑定的地址 不调用bind函数时将以主网络接口IP地址为源地址 如果设置了IP选项IP_HDRINCL,bind函数将不起作用,必须手工填充每个IP数据包的源地址,原始socket编程,绑定对方IP地址 使用connect函数绑定对方地址 发送的IP数据包目的地址就是connect绑定的对方地址 用connect绑定对方地址后可以使用函数write和send发送IP数据包 不调用connect函数,每次发送IP数据包必须使用sendto函数指定对方IP地址,原始socket编程,发送数据包 没有调用connect函数绑定对方地址时必须用sendto或sendmsg发送数据包;调用connect绑定对方IP地址之后可以使用write、send发送数据包 没有设置IP_HDRINCL选项时只能填充IP数据包的数据区;设置了IP_HDRINCL选项后可以填充IP数据包首部和数据区,但内核总是计算和填充校验和,原始socket编程,接收数据包 UDP和TCP数据包不传送到原始socket 大多数ICMP数据包(echo响应,timestamp响应,mask响应)的拷贝将传递给匹配的原始socket 其他类型的数据包的拷贝传递给匹配的原始socket 内核不能识别的IP数据包将传送给匹配的原始socket,原始socket编程,原始socket接收过程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 31510:2025 EN Cold chain logistics - Vocabulary
- GB/T 16997-2025胶粘剂主要破坏类型的表示法
- 2025年园林绿化作业人员模拟题库含完整答案详解(夺冠)
- 应急安全培训体会课件
- 应急安全与防护知识培训课件
- 应彩云小猪的野餐课件
- 自考专业(教育管理)全真模拟模拟题【有一套】附答案详解
- 新生儿心力衰竭识别与药物治疗方案
- 新生儿胆红素脑病高危因素与预防措施
- 公园合同(标准版)
- 幕墙设计方案汇报
- 安全知识竞赛活动-百问百答试题及答案
- 红火蚁宣传课件
- 养老机构法律风险课件
- 华能招标采购管理办法
- 储能电站安全性评估报告
- 中国大模型落地应用研究报告2025
- ECMO课件大全教学课件
- 肿瘤病人血管通路的选择
- 呼吸机管道安全管理体系
- 2025年重庆市中考英语试卷真题(含标准答案及解析)
评论
0/150
提交评论