软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt

上传人:牧羊曲112 文档编号:6027967 上传时间:2023-09-16 格式:PPT 页数:85 大小:374.50KB
返回 下载 相关 举报
软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt_第1页
第1页 / 共85页
软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt_第2页
第2页 / 共85页
软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt_第3页
第3页 / 共85页
软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt_第4页
第4页 / 共85页
软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt》由会员分享,可在线阅读,更多相关《软件开发实习讲义-基于C-S模式的软件开发(题目1).ppt(85页珍藏版)》请在三一办公上搜索。

1、软件开发实习讲义,提纲,实验题目及要求技术一:Socket网络编程;技术二:软件开发文档编写规范;技术三:统一建模语言UML;技术四:Rational Rose工具与UML;技术五:开发环境;,提纲,实验题目及要求技术一:Socket网络编程;技术二:软件开发文档编写规范;技术三:统一建模语言UML;技术四:Rational Rose工具与UML;技术五:开发环境;,实验题目及要求,【实验题目】基于客户端/服务器模型的软件开发【题目概述与总体要求】题目概述:设计一个XXX网络应用程序。总体要求:按照分析、设计、编码、调试和测试的软件开发过程完成这个应用程序;提交需求分析、概要设计、详细设计文档

2、以及UML设计文件(其中包括用例图,类图,状态图,部署图)。建议客户端和服务器的设计都使用可视化界面,在界面中加入相应的功能按钮或菜单,便于操作和演示。,实验题目及要求,【题目具体要求】客户端根据指定的ip地址和端口号连接到服务器;客户端可以断开和服务器的连接;服务器可以选定某个已登录的客户端,断开与其的连接;客户端可以向服务器发送文字信息;服务器要能显示所有登录客户端的ip地址、端口号信息等:服务器上需要显示客户端登录和断开的提示信息;服务器显示所有登录客户端所发送的文字信息、数目,及对应的客户端信息,标识该文字信息是哪个客户端发送;服务器能够从所有接收到文字信息中,筛选从某个登录客户端发送

3、的文字信息和数目。客户端可以显示服务器发送的文字信息及其数目;服务器可以选定某个已登录的客户端,向其发送文字信息;客户端可以向服务器发送文件。服务器显示客户端发送的文件数和当前发送的文件及对应客户端信息。15必须实现,67为加分需求,89选作。,实验题目及要求,【编程提示】开发环境和编程语言可自由选择;服务器设计一种数据结构来维护每一个客户端的信息,包括socket,IP地址,端口号、收到文字信息的数目,文字信息,其中的文字信息应该设计成另一个数据结构用来存储一个个文字信息,包括文字字符串、字符串长度。如果能使用数据库存储,当然更好。本题目中要求实现的功能较多,为了更好的开发调试,可以将上一个

4、功能实现并测试成功后,再实现其他功能。用表单显示信息。,实验题目及要求,【实验步骤】根据题目,撰写需求分析、概要设计、详细设计文档;根据需求,利用Rational Rose工具设计UML建模图(用例图、类图、状态图、部署图);根据UML建模图在开发环境中进行软件开发;实现功能15,并进行调试与测试;实现功能67,并进行调试与测试;有时间的同学可以实现功能89;提交程序源代码及文档(包括设计文档和UML图);编写实验报告,实习结束后1周内由班长交齐。,实验题目及要求,【实验报告内容】题目要求的所有文档和设计图;设计的思路和关键数据结构;测试数据,包括对于异常情况的处理;软件使用说明书;在设计、实

5、现和测试中发现的问题及解决方案;软件开发实习总结。【实验上机要求】开放式上机;第二周的周六、周日集中验收。,提纲,实验题目及要求技术一:Socket网络编程;技术二:软件开发文档编写规范;技术三:统一建模语言UML;技术四:Rational Rose工具与UML;技术五:开发环境;,网络编程模型,基于有连接网络程序的执行过程服务程序启动客户程序启动客户端与服务器建立连接客户端发送请求服务器处理请求,返回响应服务器断开连接,等待下一个请求,网络编程模型,基于TCP编程模型,主要内容,创建网络端点socket连接服务器connect绑定服务器地址和端口bind监听端口listen接受客户端连接ac

6、cept关闭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 so

7、cket(int family,int type,int protocol)功能:创建socket描述符参数:family(协议簇):AF_INET、AF_UNIXtype(类型):SOCK_STREAM、SOCK_DGRAM、SOCK_RAWprotocol(协议):默认为0返回值:0socket描述符,-1失败,系统全局变量errno为错误代码,创建网络端点socket,socket数据结构,socket地址,socket地址Linux采用通用socket地址兼容各种协议UNIXINET,通用的地址结构:struct sockaddr/*地址类型AF_xxx*/u_short sa_fam

8、ily;/*协议地址,不同的协议地址格式不同*/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_w

9、2;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位整数0 xA130为例)little-endian顺序低字节在前Intel处理器使用little-endi

10、anbig-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),socke

11、t地址,/指定服务器地址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地址,但通常客户端不需要

12、绑定自己的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

13、 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(

14、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指定已完成连接队列的最大长度,

15、监听端口,/监听端口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*client

16、addr,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要读

17、取数据大小返回值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

18、;/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 连接被复位,返回错误 阻塞过程中收到中断信号,返回EINTRwrite_all函数,in

19、t 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的引用为

20、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发送

21、者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

22、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 Sock

23、et编程,udp客户端特点客户端不用建立连接,第一次调用sendto函数时,UDP协议为这个UDP socket选择一个端口号,以后的发送和接收操作均使用这个端口号 客户端可以接收来自任何主机的数据报 客户端可能永远阻塞(服务器主机崩溃),UDP Socket编程,有连接的udp socket在udp socket上调用connect函数,但不会产生3次握手过程,只记录连接另一方的IP和端口,connect函数立即返回 特点:发送UDP数据报时不用指定服务器地址只能接收来自指定服务器的数据报,UDP Socket编程,有连接的udp socket错误返回情况数据报成功到达服务器,但服务器接收缓

24、冲区已满,丢弃该数据报,不返回错误 数据报成功到达服务器,但服务器并没有在该端口上提供服务,UDP协议丢弃数据报返回ICMP错误消息,客户端主机接收到这个ICMP消息后将以异步方式向客户端返回一个ECONNRESET错误,UDP Socket编程,有连接的udp socket断开有连接的udp socketudp socket允许对一个socket多次调用connect函数,每次调用connect函数将释放原来绑定的地址,绑定到新地址利用connect函数绑定一个特殊地址可以断开之前的udp连接,struct sockaddr_in addr;.addr.sin_family=AF_UNSPE

25、C;.connect(sockfd,(struct sockaddr*),UDP Socket编程,使用UDP Socket的说明 UDP协议不保证数据报可靠到达用超时和重发机制处理丢失的数据报用数据报序列号区分重复数据报 UDP协议不保证数据报顺序到达 UDP协议没有流量控制可以由程序维护一个发送缓冲区,将数据报保存在该缓冲区,直到收到确认才清除,当用户缓冲区满时不再发送数据报,原始socket编程,概述TCP和UDP Socket对TCP和UDP协议做了封装,简化了编程接口,但失去了对IP数据包操作的灵活性原始socket直接针对IP数据包编程,具有更强的灵活性,能够访问ICMP和IGMP

26、数据包可以编写基于IP协议的高层协议,原始socket编程,创建原始socketint socket(int family,int type,int protocol)参数:familyAF_INETtypeSOCK_RAWprotocolIPPROTO_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编程,

27、绑定本地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函数绑定对方

28、地址时必须用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编程,原始

29、socket接收过程,IP协议,ICMP协议,ICMP类型原始socket,其他原始socket,ICMP数据包,内核不处理的协议数据包,原始socket编程,原始socket编程示例PING程序:ICMP协议版本ping程序原理ping程序发送ICMP应答请求数据包,数据区中包含发送时间对方主机回送ICMP应答响应数据包,数据区内容保持不变ping程序受到ICMP应答响应数据包,将数据区内的发送时间和当前时间比较,得到时间差,即ICMP数据包的往返时间,原始socket编程,原始socket编程示例ICMP数据包格式类型:8echo request,0echo response校验和:采用I

30、P校验和计算方法标识符:进程号序列号:从0开始,依次加1,原始socket编程,原始socket编程示例相关数据结构,struct icmphdr_u8type;_u8code;_u16checksum;unionstruct_u16id;_u16sequence;echo;struct_u16_unused;_u16mtu;frag;un;,提纲,实验题目及要求技术一:Socket网络编程;技术二:软件开发文档编写规范;技术三:统一建模语言UML;技术四:Rational Rose工具与UML;技术五:开发环境;,撰写需求分析文档,需求分析文档模板(仅供参考),撰写概要设计文档,概要设计文档

31、模板(仅供参考),撰写详细设计文档,详细设计文档模板(仅供参考),提纲,实验题目及要求技术一:Socket网络编程;技术二:软件开发文档编写规范;技术三:统一建模语言UML;技术四:Rational Rose工具与UML;技术五:开发环境;,统一建模语言UML,提纲,实验题目及要求技术一:Socket网络编程;技术二:软件开发文档编写规范;技术三:统一建模语言UML;技术四:Rational Rose工具与UML;技术五:开发环境;,Rational Rose工具与UML,提纲,实验题目及要求技术一:Socket网络编程;技术二:软件开发文档编写规范;技术三:统一建模语言UML;技术四:Rational Rose工具与UML;技术五:开发环境;,开发环境,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号