《网络程序设计》期末总复习最新版 苏大.docx
《《网络程序设计》期末总复习最新版 苏大.docx》由会员分享,可在线阅读,更多相关《《网络程序设计》期末总复习最新版 苏大.docx(26页珍藏版)》请在冰点文库上搜索。
《网络程序设计》期末总复习最新版苏大
前言:
陆老师:
“附件中为经修改、增添内容后的最新《网络程序设计总复习题》,请转发全班同学,以复习这个为准,考试也已这个为准。
另外,考试的读程序部分,要求能读懂LinuxBerkeleySocket编写的程序、WindowsWinsock编写的程序,其中WindowsMFC程序要求能读懂书上的对话框界面的Talkc程序中的各个类的程序编写,也请转告各位同学。
祝你们全班都能考个好成绩。
陆建德,即日”
第一章网络编程基础
1.实现网间进程通信必须解决哪些问题?
答:
(1)网间进程的标识问题;
(2)如何与网络协议栈连接的问题;
(3)协议的识别问题;
(4)不同的通信服务的问题
2.说明TCP/IP中,端口的概念和端口的分配机制。
答:
端口是TCP/IP协议族中,应用层进程与传输层协议实体间的通信接口。
TCP/IP协议采用了全局分配(静态分配)和本地分配(动态分配)相结合的分配方法。
对于TCP,或者UDP,将它们的全部65535个端口号分为保留端口号和自由端口号两部分。
保留端口的范围是0—1023,又称为众所周知的端口或熟知端口(well-knownport),其余的端口号,1024-65535,称为自由端口号,采用本地分配,又称为动态分配的方法。
总之,TCP或UDP端口的分配规则是:
端口0:
不使用,或者作为特殊的使用;
端口1-255:
保留给特定的服务,TCP和UDP均规定,小于256的端口号才能分配给网上著名的服务;
端口256-1023:
保留给其他的服务,如路由;
端口1024-4999:
可以用作任意客户的端口;
端口5000-65535:
可以用作用户的服务器端口。
3.什么是网络应用进程的网络地址?
说明三元组和五元组的概念。
答:
(传输层协议,主机的IP地址,传输层的端口号)标识了因特网中,进程间通信的一个端点,也把它称为网络应用进程的网络地址。
(传输层协议,主机的IP地址,传输层的端口号),这样一个三元组,叫做一个半相关(half-association)。
(传输层协议,本地机IP地址,本地机传输层端口,远地机IP地址,远地机传输层端口),这样一个五元组称为一个全相关(association)。
即两个协议相同的半相关才能组合成一个合适的全相关,或完全指定一对网间通信的进程。
4.举例说明面向消息的协议与基于流动协议有什么不同。
答:
例如甲向乙发送三个消息,分别是:
128、64和32字节。
面向消息的协议中,如果接受缓冲区是256字节,足以接收3条消息,且这三条消息全部达到。
乙仍然需要发送3条读取消息。
分别返回128、64、32字节,而不用一次读取来调用者单个数据包。
基于流的消息协议中,在接收端乙的堆栈把所有进来的消息数据包聚集在一起,放入堆栈,等待应用进程读取。
进程发送读取命令,指定了进程接收缓冲区,如果进程缓冲区有256字节,系统马上返回全部224字节。
5.说明C/S模式的概念、工作过程和特点。
答:
C/S模式即客户机/服务器模式,是应用程序最常用的通信模式。
服务器的工作过程是:
(1)打开一通信通道,并告知服务器所在的主机,它愿意在某一公认的地址上接收客户请求。
(2)等待客户的请求到达该端口。
(3)服务器接收到服务请求,处理该请求并发送应答信号。
为了能并发地接收多个客户的服务请求,要激活一个新进程或新线程来处理这个客户请求(如UNIX系统中用fork、exec)。
服务完成后,关闭此新进程与客户的通信链路,并终止。
(4)返回第二步,等待并处理另一客户请求。
(5)在特定的情况下,关闭服务器。
客户端的工作过程:
(1)打开一通信通道,并连接到服务器所在主机的特定监听端口。
(2)向服务器发送请求报文,等待并接收应答;继续提出请求,与服务器的会话按照应用协议进行。
(3)请求结束后,关闭通信通道并终止。
特点:
(1)客户和服务器都是软件进程,C/S模式是网络上通过进程通信建立分布式应用的常用模型。
(2)非对称性:
服务器通过网络提供服务,客户通过网络使用服务,这种不对称性体现在软件结构和工作过程上。
(3)对等性:
客户和服务器必有一套共识的约定,必与以某种应用层协议相联,并且协议必须在通信的两端实现。
(4)服务器的被动性:
服务器必须先行启动,时刻监听,及时服务,只要有客户请求,就立即处理并响应,回传信息。
但决不主动提供服务。
(5)客户机的主动性:
客户机可以随时提出请求,通过网络得到服务,也可以关机走人,一次请求与服务的过程是由客户机首先激发的。
(6)一对多:
一个服务器可以为多个客户机服务,客户机也可以打开多个窗口,连接多个服务器。
(7)分布性与共享性:
资源在服务器端组织与存储,通过网络分散在多个客户端使用。
第二章UNIX套接字编程接口
1.实现套接字编程接口的两种方式是什么?
答:
一种是在操作系统的内核中增加相应的软件来实现,一种是通过开发操作系统之外的函数库来实现。
UNIX使用前者,Windows使用后者。
2.套接字通信与UNIX操作系统的输入/输出的关系是什么?
答:
(p.29)
Unix操作系统对文件和所有其他的I/O设备采用一种统一的操作模式,就是“打开-读-写-关闭”的I/O模式,套接字编程接口也被纳入Unix操作系统的传统输入输出概念的范畴。
在Unix的实现中,套接字是完全与其它I/O集成在一起的。
操作系统和应用程序都将套接字编程接口也看做一种I/O机制,体现在:
(1)操作的过程类似,套接字沿用了大多数I/O所使用的“打开-读-写-关闭”模式,先创建套接字,然后使用它,最后将它删除;
(2)操作方法类似,使用描述符,先申请生成一个套接字,系统返回一个描述符,在调用有关套接字进行网络数据传输时,就将这个描述符作为参数;
(3)使用的过程的名字也类似,如接收网络数据与发送网络数据用read和write过程。
3.什么是套接字?
说明套接字特点。
答:
套接字是应用程序通过网络协议栈进行通信交互的接口。
套接字特点是:
(1)通信域。
套接字通常只和同一域中的套接字交换数据。
如果数据交换要穿越域的边界,就一定要执行某种解释程序。
(2)套接字有三种类型:
流式、数据报和原始套接字。
(3)套接字由应用层创建,并为其服务,而后被释放。
(4)使用确定的IP地址和传输层端口号。
4.说明主机字节顺序和网络字节顺序的概念。
答:
不同计算机中,存放多字节值的顺序不同,有的先低后高,有的先高后低。
具体计算机中的多字节数据的存储顺序称为主机字节顺序。
在网络协议中,对多字节数据在网络协议报头中的存储顺序称为网络字节顺序。
在设计网络应用程序时,应注意两种字节顺序的转换:
在网络应用程序发送时,应将主机字节顺序的IP地址和端口号分别用htonl()和htons()转换为网络字节顺序,设置到网络协议报头的对应字段中。
在网络应用程序接收时,应将网络协议报头对应字段中的网络字节顺序的IP地址和端口号分别用ntohl()和ntohs()转换为主机字节顺序,赋值到本机变量和内存中。
5.数据报套接字的编程基本步骤
答:
数据报也即无连接套接字有两种模式:
(1)对等模式:
(2)C/S模式:
6.原始套接字的编程基本步骤
原始套接字编程步骤如下:
(1)采用恰当的协议标志,创建原始套接字句柄;
(2)根据需要设置套接字的选项;
(3)调用connect和bind函数来绑定对方和本地地址;
(4)发送数据包、接收数据包;
(5)用完后,关闭套接字。
7.服务器端和客户机端操作流式套接口的工作过程。
见下图。
8.利用Unix操作系统的fork()系统调用,写出编制多进程并发执行服务器程序的基本编程框架。
在服务器程序中用fork()创建子进程,对于每一个客户端,用一个专门的进程为它服务,通过进程的并发执行,来实现对多个客户机的并发访问,基本的编程框架如下:
第三章Windows环境的网络编程
1.WinSock规范与Berkeley套接口的区别是什么?
答:
(a)套接口数据类型和该类型的错误返回值
(b)select()函数和FD_*宏。
在Winsock中,使用select()函数时,应用程序应坚持用FD_XXX宏来设置,初始化,清除和检查fd_set结构。
(c)错误代码的获得在Winsock中,错误代码可以使用WSAGetLastError()调用得到。
(d)指针:
所有应用程序与WindowsSockets使用的指针都必须是FAR指针。
(e)重命名的函数:
close()改变为closesocket(),ioctl()改变为ioctlsocket()
(f)Winsock支持的最大套接口数目在WINSOCK.H中缺省值是64,在编译时由常量FD_SETSIZE决定。
(g)头文件:
原来Berkeley套接字的多个头文件现在被包含在Winsock的一个头文件中:
对WindowsSockets1.1的应用程序,只需简单地包含winsock.h就足够了,对WindowsSockets2.x的应用程序,只需简单地包含winsock2.h就行了。
(h)Winsock规范对于原始套接口的支持。
(i)Winsock规范对于原始套接口和消息驱动机制的支持。
体现在异步选择机制、异步请求函数、阻塞处理方法、错误处理、启动和终止等方面。
2.WinSock的注册和注销的过程
答:
①注册过程:
在WinSock程序的开始处,要调用WSAStartup,其格式:
intWSAStartup(WORDwVersionRequested,LPWSADATAlpWSAData);
其中,wVersionRequested:
指定要使用的WinSock的最高版本号,
lpWSAData:
用来返回WinSockAPI实现细节的WSAData结构变量指针。
②注销过程:
WinSock应用程序结束前,必须调用WSACleanup()函数,其格式为:
intWSACleanup(void);
以解除与Winsock.DLL库的绑定,释放Winsock实现分配给应用程序的系统资源,中止对WindowsSocketsDLL的使用。
3.简要说明Unix/Linux操作系统和Windows操作系统对套接字网络编程接口的两种实现方式,这两种实现方式的差别体现在网络编程时有什么不同?
答:
要想实现套接字编程接口,可以采用两种实现方式:
一种是Unix/Linux的方法,在操作系统的内核中增加相应的软件来实现,在BSDUnix及起源于它的操作系统中,套接字函数是操作系统本身的功能调用,是操作系统内核的一部分。
另一种是Windows的方法,通过开发操作系统之外的winsock函数库来实现,其中每个函数具有与Unix套接字函数相同的名字与参数,这样,套接字库就能向没有本机套接字的计算机上的应用程序提供套接字编程接口。
这两种套接字实现方式的差别使得后者(Windows操作系统)需要在编的程序开始语句中先要装载并初始化winsock动态链接库(使用WSAStartup函数),在程序结束前需要卸载和注销winsock动态链接库(使用WSACleanup函数)。
而前者(Unix操作系统)则完全不需要这两个函数做初始化和卸载注销工作。
4.画框图说明同步套接字的send函数的执行流程。
注意:
buf是用户进程的发送缓冲区,而SYSBUF是系统套接字的数据发送缓冲区。
第四章MFC编程
1.说明构成应用程序的对象之间的关系。
(有哪些对象以及各对象之间的关系)
这里,用图的形式可直观地表示所涉及的MFC类的继承或者派生关系,如下图所示。
2.简述典型MDI(多文档)界面的MFC应用程序Test所包含的各个类及其基本功能。
答:
(1)应用程序类(CTestApp),派生于CWinApp,负责应用程序的初始化、运行和结束。
(2)主边框窗口类(CMainFrame),由CMDIFrameWnd派生,用于管理菜单、工具条、加速键、文档边框窗口、视图窗口等,协调半模式状态等。
(3)文档边框窗口类(CChildFrame),由CMDIChildWnd派生,MDI应用程序用文档边框窗口来包含视图窗口。
(4)文档类(CTestDoc),从CDocument类派生,用来管理数据。
视图窗口通过文档对象来访问和更新数据。
(5)视图类(CTestView),从CView类或其它派生类派生。
视图和文档相关联,在文档和用户之间起中介作用。
(6)文档模板类(CMultiDocTemplate)。
MDI应用程序通过文档模板类对象建立文档边框窗口类对象、文档类对象、视图类对象三者的联系,管理这三个对象的创建。
3.说明MFC对象和Windows对象的关系。
所谓Windows对象是Win32下用句柄表示的Windows操作系统对象;所谓MFC对象是C++对象,是一个C++类的实例。
两者有很大的区别,但联系紧密。
以窗口对象为例:
抽象,高层封装底层对象
MFC的CWnd类窗口对象和Windows的窗口对象的关系
4.说明MFC对象和Windows对象的区别。
(p.109–p.110)
(1)对应的数据结构不同
(2)所处的层次不同
(3)创建的机制不同
(4)二者转换的方式不同
(5)使用的范围不同
(6)销毁的方法不同
5.CObject类具有哪些特性?
p.116
答:
CObject类有很多有用的特性:
①对运行时类信息的支持;
②对动态创建的支持;
③对序列化的支持;
④对象诊断输出,等等。
6.说明应用程序、文档模板、边框窗口、视图和文档等的创建关系。
p.121(创建的前后顺序)
答:
①应用程序是全局对象,在启动程序之前构造;
②应用程序创建文档模板;
③文档模板创建文档和边框窗口;
④边框窗口创建视图。
7.MFC应用程序的执行分为哪三个阶段?
每个阶段主要做什么?
答:
MFC应用程序的执行分为三个阶段:
(1)应用程序启动和初始化阶段:
MFC程序在该阶段(主要在应用程序类的InitInstance()中)创建MFC对象和Windows对象、建立各种对象之间的关系,并把窗口显示在屏幕上;
(2)与用户交互阶段:
MFC程序在该阶段会产生各种消息,经主程序的消息循环发送到操作系统,操作系统找到相应类中该消息对应的消息处理回调函数,执行用户程序的各种交互响应功能;
(3)程序退出和清理阶段:
MFC程序在该阶段,关闭窗口、销毁所创建的Windows对象和MFC对象。
8.以一个SDI界面的应用程序Test为例,说明该MFC程序由哪几个类构成,简述其启动、运行、退出的工作过程。
答:
以一个SDI界面的应用程序Test为例,该MFC应用程序由应用程序类CTestApp、框架窗口类CMainFrame、文档类CTestDoc、视图类CTestView组成,其启动、运行、退出过程如下图所示,同样经历上题所述的三个阶段。
在阶段
(1)应用程序启动和初始化阶段:
①先实例化CTestApp类的应用程序全局对象theApp;
②然后启动执行WinMain(),该函数在隐藏的MFC框架程序中;
③在WinMain()中,该函数先取得本应用程序对象的指针pApp,此后会执行AFX内部初始化AfxWinInit()、应用程序全局初始化InitApplication(),然后,执行该应用程序实例对象自己特定的初始化InitInstance(),用户在此可重载该虚拟函数,做诸如创建文档模板、框架窗口、文档、视图,建立它们之间的关联、显示窗口、更新窗口等窗口程序初始化工作;
④然后,在WinMain()中执行消息循环Run(),等待接收消息。
在阶段
(2)与用户交互阶段:
用户操作程序运行时会产生各种消息,由主程序WinMain()中执行的消息循环Run(),会接收、转换、发送这些消息到操作系统,操作系统找到相应类中这个消息对应的消息处理回调函数,执行各种消息的处理,作出与用户交互的响应。
在阶段(3)程序退出和清理阶段:
①如用户单击主窗口的关闭按钮,会产生ID_APP_EXIT消息,相应执行消息处理函数CWinApp:
:
OnAppExit(),会向主窗口发送WM_CLOSE消息;
②主窗口收到WM_CLOSE消息,相应执行消息处理函数CFrameWnd:
:
OnClose(),在该函数中会处理各类边框窗口的关闭,还涉及到关闭相关的文档、销毁相关的窗口,关闭窗口后,发送WM_QUIT消息;
③在WinMain()中执行的消息循环Run()中收到WM_QUIT消息后,则执行退出处理函数ExitInstance(),用户可重载此函数,如删除自己的对象(注意:
MFC可以自动删除标准对象,如文档、视图和窗口框架等),退出消息循环,进而退出整个MFC应用程序。
9.消息循环的过程是什么?
p.124-125,及图4.7
在主进程的消息循环中,调用PeekMessage()函数来获取消息,若没有消息,则进行空闲Idle处理(执行OnIdle空闲处理函数),然后用PumpMessage()函数来转换消息和发送消息给操作系统,若消息是WM_QUIT消息,则调用ExitInstance()函数后退出消息循环。
10.应用程序的退出过程是什么?
p.126
答:
下面以单击主窗口的关闭按钮为例,来说明应用程序退出的过程。
1)用户单击主窗口的关闭按钮,导致发送MFC发送标准命令消息ID_APP_EXIT,于是MFC调用相应的CWinApp:
:
OnAppExit()消息处理函数来完成对该命令消息的缺省处理,主要是向主窗口发送WM_CLOSE消息。
2)主窗口处理WM_CLOSE消息,于是MFC调用相应的CFrameWnd:
:
OnClose()消息处理函数,在该函数中处理各类边框窗口的关闭,还涉及到关闭相关的文档、销毁相关的窗口,关闭窗口后,发送WM_QUIT消息。
3)消息循环中收到WM_QUIT消息后,退出消息循环,进而退出整个应用程序。
第五章MFCWinSocket类的编程
1.使用CAsyncSocket类的一般步骤是什么?
答:
CAsyncSocket类是异步套接字类。
使用的一般步骤如下:
序号
服务器(Server)
客户机(Client)
1
//构建一个套接字
CAsyncSocketsockSrvr;
//构建一个套接字
CAsyncSocketsockClient;
2
//创建SOCKET句柄,绑定到指定的端口
sockSrvr.Create(nPort);
//创建SOCKET句柄,使用默认参数
sockClient.Create();
3
//启动监听,时刻准备接受连接请求
sockSrvr.Listen();
4
//请求连接到服务器
sockClient.Connect(strAddr,nport);
5
//构造一个新的空的套接字
CasyncSocketsockRecv;
//接收连接sockSrvr.Accept(sockRecv);
6
//接收数据
sockSrvr.Receive(pBuf,nLen);
//发送数据
sockClient.Send(pBuf,nLen);
7
//发送数据
sockSrvr.Send(pBuf,nLen);
//接收数据
sockClient.Receive(pBuf,nLen);
8
//关闭套接字对象
sockSrvr.Close();
//关闭套接字对象
sockClient.Close();
2.CAsyncSocket类可以接受并处理哪些消息事件?
当这些网络事件发生时,MFC框架作何处理?
(消息机制)
答:
MFC套接字对象可以接受并处理的六种网络事件:
(1)FD_READ事件通知:
通知输入缓冲区中有数据可读。
(2)FD_WRITE事件通知:
通知输出缓冲区已腾空,可以写数据。
(3)FD_ACCEPT事件通知:
通知服务器端的监听套接字有连接请求可以接受。
(4)FD_CONNECT事件通知:
通知客户端的请求连接的套接字,连接的要求已被处理。
(5)FD_CLOSE事件通知:
通知套接字已关闭。
(6)FD_OOB事件通知:
通知将有带外数据到达
处理:
按照Windows的消息驱动机制,MFC框架应当把消息发送给相应的套接字对象,并调用作为该对象成员函数的事件处理函数。
事件与处理函数是一一映射的。
在afxSock.h文件中的CAsyncSocket类的声明中,定义了与这六个网络事件对应的事件处理函数:
对应FD_READ事件,处理函数为OnReceive();将接收数据。
对应FD_WRITE事件,处理函数为OnSend();将发送数据。
对应FD_ACCEPT事件,处理函数为OnAccept();服务器端将接受待决的连接请求。
对应FD_CONNECT事件,处理函数为OnConnect();此时客户端将可使用该连接来传输数据。
对应FD_CLOSE事件,处理函数为OnClose();将做该套接字被关闭时本方应做的结束善后工作。
对应FD_OOB事件,处理函数为OnOutOfBandData();将会在逻辑上独立的带外通道上接收带外数据。
3.CSocket类如何通过CArchive对象来进行数据传输?
答:
使用CSocket类的最大优点在于,应用程序可以在连接的两端通过CArchive对象来进行数据传输。
CSocket类是同步套接字类,提供阻塞调用。
同时用CSocket类时,必须使用流式套接字。
具体做法是:
(1)创建CSocket类套接字对象
(2)创建基于CSocketFile类的文件对象,并关联到套接字对象(使用已创建的CSocket类对象的指针)。
(3)创建用于输入和输出的CArchive对象,并关联到CSocketFile类文件对象(使用已创建的CSocketFile类对象的指针)。
(4)利用CArchive对象来发送和接收数据。
4.说明CSocket类的编程模型。
答:
下面给出针对流式套接字的CSocket类的编程模型:
服务器端:
(1)CSocketsockServ;//创建空的服务器端监听套接字对象。
(2)sockServ.Create(nPort);
//用众所周知的端口,创建监听套接字对象的底层套接字句柄。
(3)sockServ.Listen();//启动对于客户端连接请求的监听。
(4)CSocketsockRecv;//创建空的服务器端连接套接字对象。
sockServ.Accept(sockRecv);
//接收客户端的连接请求,并将其他的任务转交给连接套接字对象。
(5)CSocketFile*file;
file=newCSocketFile(&sockRecv);//创建文件对象并关联到连接套接字对象。
(6)CArchive*arIn,arOut;
arIn=CArchive(&file,CArchive:
:
load);//创建用于输入的归档对象,
arOut=CArchive(&fil