为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

网络编程实用教程课后习题

2017-10-16 33页 doc 185KB 99阅读

用户头像

is_569018

暂无简介

举报
网络编程实用教程课后习题网络编程实用教程课后习题 第一章 网络编程基础 1. 什么是线程~什么是进程, 答:进程是处于运行过程中的程序实例~是操作系统调度和分配资源的基本单位。 一个进程实体由程序代码、数据和进程控制块三部分构成。线程是进程中的一个实体~是被系统独立调度和分派的基本单位~线程自己不拥有系统资源~只拥有一点在运行中必不可少的资源~但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 2.描述网络应用程序的一般组成。为什么说应用层协议是在应用程序中实现的? 答:从功能上~可以将网络应用程序分为两部分~一部分是专门负责网络通信的...
网络编程实用教程课后习题
网络编程实用教程课后习题 第一章 网络编程基础 1. 什么是线程~什么是进程, 答:进程是处于运行过程中的程序实例~是操作系统调度和分配资源的基本单位。 一个进程实体由程序代码、数据和进程控制块三部分构成。线程是进程中的一个实体~是被系统独立调度和分派的基本单位~线程自己不拥有系统资源~只拥有一点在运行中必不可少的资源~但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 2.描述网络应用程序的一般组成。为什么说应用层是在应用程序中实现的? 答:从功能上~可以将网络应用程序分为两部分~一部分是专门负责网络通信的模块~它们与网络协议栈相连接~借助网络协议栈提供的服务完成网络上数据信息的交换。另一部分是面向用户或者作其他处理的模块~它们接收用户的命令~或者对借助网络传输过来的数据进行加工~这两部分模块相互配合~来实现网络应用程序的功能。 2. 实现网间进程通信必须解决哪些问题, 答:,1,网间进程的标识问题,,2,如何与网络协议栈连接的问题,,3,协议的识别问题,,4,不同的通信服务的问题 4.说明TCP/IP中~端口的概念和端口的分配机制。 答:端口是TCP/IP协议族中~应用层进程与传输层协议实体间的通信接口。TCP/IP协议采用了全局分配,静态分配,和本地分配,动态分配,相结合的分配方法。 对于TCP~或者UDP~将它们的全部65535个端口号分为保留端口号和自由端口号两部分。保留端口的范围是0—1023~又称为众所周知的端口或熟知端口,well-known port,~其余的端口号~1024-65535~称为自由端口号~采用本地分配~又称为动态分配的方法。 总之~TCP或UDP端口的分配规则是: 端口0:不使用~或者作为特殊的使用,端口1-255:保留给特定的服务~TCP和UDP均规定~小于256的端口号才能分配给网上著名的服务,端口256-1023:保留给其他的服务~如路由, 端口1024-4999:可以用作任意客户的端口,端口5000-65535:可以用作用户的服务器端口。 5.什么是网络应用进程的网络地址,说明三元组和五元组的概念。 答:应用层进程地址=,传输层协议~主机的IP地址~传输层的端口号,~它标识了因特网中~进程间通信的一个端点~也把它称为进程的网络地址。 ,传输层协议~主机的IP地址~传输层的端口号,~这样一个三元组~叫做一个半相关,half-association,。 (传输层协议~本地机IP地址~本地机传输层端口~远地机IP地址~远地机传输层端口)~五元组称为一个全相关,association,。即两个协议相同的半相关才能组合成一个合适的全相关~或完全指定一对网间通信的进程。 6.举例说明面向消息的协议与基于流动协议有什么不同。 、64和32字节。 答:例如甲向乙发送三个消息~分别是:128 面向消息的协议中~如果接受缓冲区是256字节~足以接收3条消息~且这三条消息全部达到。乙仍然需要发送3条读取消息。分别返回128、64、32字节~而不用一次读取来调用者单个数据包。 基于流的消息协议中~在接收端乙的堆栈把所有进来的消息数据包聚集在一起~放入堆栈~等待应用进程读取。进程发送读取命令~指定了进程接收缓冲区~如果进程缓冲区有256字节~系统马上返回全部224字节。 7.TCP提供的服务有哪些特征, 答:应用层进程提供一个面向连接的、端到端的、完全可靠的,无差错、无丢失、无 重复或失序,全 双工的流传输服务。 允许网络中的两个应用程序建立一个虚拟的链接~在任何一个方向上发送数据~把数据当作一个双向字节流进行交换~最后终止连接。 8.简要说明三类网络编程。 答:基于WWW应用的网络编程技术~包括所见即所得的网页制作工具~和动态服务器页面的制作技术。 .NET平台有四组产品 ? 开发工具 ? 专用服务器? Web 服务。? 设备。MS.NET顺应了软件工业的趋势~包括4个方面:? 分布式计算? 组件化? 企业级别的服务? WEB 范型转移。.NET平台由三层软件构成? 顶层是全新的开发工具VS.NET~? 中间层包括三部分:.NET服务器、.NET服务构件和.NET框架。? 底层是WINDOWS操作系统。Web服务是松散耦合的可复用的软件模块~在Internet上发布后~能通过的Internet 协议在程序中访问~具有以下的特点:,1,可复用,2,松散耦合,3,封装了离散,4,Web服务可以在程序中访问,5,Web服务在Internet上发布 9(说明C/S模式的概念、工作过程和特点。 答:C/S模式即客户机/服务器模式~是应用程序最常用的通信模式。 服务器的工作过程是:,1,打开一通信通道~并告知服务器所在的主机~它愿意在某一公认的地址上接收客户请求。,2,等待客户的请求到达该端口。,3,服务器接收到服务请求~处理该请求并发送应答信号。为了能并发地接收多个客户的服务请求~要激活一个新进程或新线程来处理这个客户请求,如UNIX系统中用fork、exec,。服务完成后~关闭此新进程与客户的通信链路~并终止。,4,返回第二步~等待并处理另一客户请求。,5,在特定的情况下~关闭服务器。 客户方工作过程: ,1,打开一通信通道~并连接到服务器所在主机的特定监听端口。,2,向服务器发送请求报文~等待并接收应答,继续提出请求~与服务器的会话按照应用协议进行。,3,请求结束后~关闭通信通道并终止。 特点:,1,客户和服务器都是软件进程~C/S模式是网络上通过进程通信建立分布式应用的常用模型。 ,2,非对称性:服务器通过网络提供服务~客户通过网络使用服务~这种不对称性体现在软件结构和工作过程上。,3,对等性:客户和服务器必有一套共识的约定~必与以某种应用层协议相联~并且协议必须在通信的两端实现。,4,服务器的被动性:服务器必须先行启动~时刻监听~及时服务~只要有客户请求~就立即处理并响应~回传信息。但决不主动提供服务。,5,客户机的主动性:客户机可以随时提出请求~通过网络得到服务~也可以关机走人~一次请求与服务的过程是由客户机首先激发的。 ,6,一对多:一个服务器可以为多个客户机服务~客户机也可以打开多个窗口~连接多个服务器。 ,7,分布性与共享性:资源在服务器端组织与存储~通过网络分散在多个客户端使用。 10.说明用户和客户机~服务器和服务器类计算机的区别。 答:“客户”(client)和服务器都指的是应用进程~即计算机软件。 “用户”(user)指的是使用计算机的人。 服务器,server,这个术语来指那些运行着的服务程序。 服务器类计算机,server-class computer,这一术语来称呼那些运行服务器软件的强大的计算机。 第二章 UNIX套接字编程接口 2.实现套接字编程接口的两种方式是什么, 答:一种是在操作系统的内核中增加相应的软件来实现~一种是通过开发操作系统之外的函数库来实现。 4.什么是套接字, 答:是应用程序通过网络协议栈进行通信交互的接口。 5.说明套接字特点。 答:,1,通信域。套接字通常只和同一域中的套接字交换数据。如果数据交换要穿越域的边界~就一定要执行某种解释程序。,2,套接字有三种类型~流式、数据包和原始套接字。,3,套接字由应用层创建~并为其服务~而后被释放。,4,使用确定的IP地址和传输层端口号。 6.说明套接字应用场合。 答:,1,不管是采用对等模式或者客户机/服务器模式~通信双方的应用程序都需要开发。,2,双方所交换数据的结构和交换数据的顺序有特定的要求~不符合现在成熟的应用层协议~甚至需要自己去开发应用层协议~自己设计最适合的数据结构和信息交换规程。 7.说明本机字节顺序和网络字节顺序的概念。 答:在具体计算机中的多字节数据的存储顺序~称为本机字节顺序。多字节数据在网络协议报头中的存储顺序~称为网络字节顺序。 8.流式套接口的工作过程 9.什么是阻塞问题,如何对应, 答:阻塞是指一个进程执行了一个函数或者系统调用~该函数由于某种原因不能立即完成~因而不能返回调用它的进程~导致进程受控于这个函数而处于等待的状态~进程 的这种状态称为阻塞。利用UNIX操作系统的FORK()系统调用~编制多进程并发执行的服务器程序。 第三章 Windows环境的网络编程 1.试述WinSock 1.1的特点。 答:,1,WinSock 1.1 全面继承了Berkeley Sockets ,2,数据库函数。其中六个采用getXbyY()的形式~大多要借助网络上的数据库来获得信息~ ,3,WinSock 1.1 扩充了Berkeley Sockets规范 ,4,WinSock 1.1只支持TCP/IP协议栈 2.WinSock规范与Berkeley套接口的区别是什么, 答:a.套接口数据类型和该类型的错误返回值 b.select()函数和FD_*宏。在Winsock中~使用select()函数时~应用程序应坚持用FD_XXX宏来设臵~初始化~清除和检查fd_set结构。 c.错误代码的获得 在Winsock中~错误代码可以使用WSAGetLastError()调用得到。 d.指针所有应用程序与Windows Sockets使用的指针都必须是FAR指针。 e.重命名的函数。,1,close()改变为closesocket(),2,ioctl()改变为ioctlsocket() f.Winsock支持的最大套接口数目 在WINSOCK.H中缺省值是64~在编译时由常量FD_SETSIZE决定。 g.头文件 Berkeley头文件被包含在WINSOCK.H中。一个Windows Sockets应用程序只需简单地包含WINSOCK.H就足够了。h. Winsock规范对于原始套接口的支持.i.Winsock规范对于原始套接口和消息驱动机制的支持。体现在异步选择机制、异步请求函数、阻塞处理方法、错误处理、启动和终止等方面。 3.WinSock的注册和注销过程 答:注册过程:调用WSAStartup 的格式:int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); wVersionRequested:指定要使用的WinSock的最高版本号~ lpWSAData用来返回WinSockAPI实现细节的WSAData结构变量指针。 注销过程:应用程序必须调用WSACleanup()函数~来解除与Winsock.DLL库的绑定~释放Winsock实现分配给应用程序的系统资源~中止对Windows Sockets DLL的使用。 int WSACleanup ( void ); 4.说明WSAStartup函数初始化过程。 ,1,查找WinSock.DLL文件~如果有WinSock实现~则调入相关信息。若无~则初始化失败。返回错误信息。,2,。确认版本号。,3,建立WinSock同应用程序的联系。,4,函 初始化失败”。 数创建成功~在WSAData结构中返回许多信息~否则~用户“ 5.画框图说明同步套接字的send函数的初始化过程。 : 第四章 1.为什么说MFC是一个编程框架,它提供了哪些相应的工具, ,Microsoft Foundation Class Library, MFC应用程序框架~简称MFC框架~是由MFC 中的各种类结合起来构成的。MFC框架从总体上定义了应用程序的轮廓~并提供了用户接口的标准实现方法~程序员只须通过预定义的接口把具体应用程序特有的东西填入这个轮廓~就能建立Windows下的应用程序。 Microsoft Visual C++提供了相应的工具来完成这个工作:用应用程序向导,AppWizard,可以生成应用程序的骨架文件,代码和资源等,,用资源编辑器可以直观地设计用户接口,用类向导,ClassWizard,可以将代码添加到骨架文件,用编译器可以通过类库实现应用程序特定的逻辑。MFC实现了对应用程序概念的封装~把类、类的继承、动态约束、类的关系和相互作用等封装起来。 2.MFC类库封装了哪些内容, 1,对Win32应用程序编程接口的封装 2,对应用程序概念的封装 3,对COM/OLE特性的封装 4,对ODBC功能的封装 3.典型的MDI应用程序AppWizard会自动创建一系列文件~如果工程的名字是My,这些文件的名字是什么, 头文件My.h~实现文件My.cpp,资源文件My.rc和模块定义文件My.def 4.说明构成应用程序的对象之间的关系。 这里~用图的形式可直观地表示所涉及的MFC类的继承或者派生关系~如图4.2所示意。 图4.2 构成MDI应用程序的各对象之间的派生关系 5.说明MFC对象和Windows对象的关系。 所谓Windows对象是Win32下用句柄表示的Windows操作系统对象,所谓MFC对象是C++对象~是一个C++类的实例。两者有很大的区别~但联系紧密。 以窗口对象为例: 图4.3 MFC的CWnd类窗口对象和Windows的窗口对象的关系 6.说明MFC对象和Windows对象的区别。 ,1,对应的数据结构不同 ,2,所处的层次不同 ,3,创建的机制不同 ,4,二者转换的方式不同 ,5,使用的范围不同 ,6,销毁的方法不同 7.CObject类具有哪些特性, CObject类有很多有用的特性:对运行时类信息的支持~对动态创建的支持~对串行化的支持~对象诊断输出~等等。 8.说明应用程序、文档模板、边框窗口、视图和文档等的创建关系。P121 答:应用程序是全局对象~在启动程序之前构造,应用程序创建文档模板,文档模板创建文档和边框窗口,边框窗口创建试图。 9.说明WinMain入口函数的流程。P123 10.消息循环的过程是什么,P124 11.应用程序的退出过程是什么, 下面以单击主窗口的关闭按钮为例~来说明应用程序退出的过程。 1, 用户单击主窗口的关闭按钮~导致发送MFC标准命令消息ID_APP_EXIT。MFC调用 CwinApp::OnAppExit()来完成对该命令消息的缺省处理~主要是向主窗口发送 WM_CLOSE消息。 2, 主窗口处理WM_CLOSE消息。 3, 收到WM_QUIT消息后~退出消息循环~进而退出整个应用程序。 第五章 一、MFC提供的两个套接字类是什么, 答:CAsyncSocket类~CSocket类。 二、为什么说CAsyncSocket类是在很低的层次上对Windows Sockets API进行了封装, 答:它的成员函数和Windows Sockets API的函数调用直接对应。一个CAsyncSocket对象代表了一个Windows套接字。它是网络通信的端点。除了把套接字封装成C++的面向对象的形式供程序员使用以外~这个类唯一所增加的抽象就是将那些与套接字相关的Windows消息变为CAsyncSocket类的回调函数。 三、为什么说Csocket类是对Windows Sockets API的高级封装, 答:CSocket类继承了CAsyncSocket类的许多成员函数~用法一致。CSocket类的高级表现在三个方面: ,1,CSocket结合archive类来使用套接字。 ,2,CSocket管理了通信的许多方面~如字节顺序问题和字符串转换问题。 ,3,CSocket类为Windows消息的后台处理提供了阻塞的工作模式。 四、使用CAsyncSocket类的一般步骤是什么, 答: 序号 服务器,Server, 客户机,Client, 1 //构建一个套接字 //构建一个套接字 CAsyncSocket sockSrvr; CAsyncSocket sockClient; 2 //创建SOCKET句柄~绑定到指定//创建SOCKET句柄~使用默认参数 的端口 sockClient.Create(); sockSrvr.Create(nPort); 3 //启动监听~时刻准备接受连接 请求 sockSrvr.Listen(); 4 //请求连接到服务器 sockClient.Connect(strAddr,nport); 5 //构造一个新的空的套接字 CasyncSocket sockRecv; //接收连接 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(); 五、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类的声明中~定义了与这六个网络事件对应的事件处理函数。 virtual void OnReceive(int nErrorCode); 对应 FD_READ事件 virtual void OnSend(int nErrorCode); 对应 FD_WRITE事件 virtual void OnAccept(int nErrorCode); 对应 FD_ACCEPT事件 virtual void OnConnect(int nErrorCode); 对应 FD_CONNECT事件 virtual void OnClose(int nErrorCode); 对应 FD_CLOSE事件 virtual void OnOutOfBandData(int nErrorCode); 对应 FD_OOB事件 六、CSocket类如何通过Carchive对象来进行数据传输, 答:使用CArchive对象和套接字一起进行数据传输工作~必须使用流式套接字 七、说明CSocket类的编程模型。 答:下面给出针对流式套接字的CSocket类的编程模型 1(服务器端 ,1,CSocket sockServ; // 创建空的服务器端监听套接字对象。 // 用众所周知的端口~创建监听套接字对象的底层套接字句柄。 ,2,sockServ.Create( nPort ); ,3,sockServ.Listen(); // 启动对于客户端连接请求的监听。 ,4,CSocket sockRecv; // 创建空的服务器端连接套接字对象。 sockServ.Accept( sockRecv); // 接收客户端的连接请求~并将其他的任务转交给连接套接字对象。 ,5,CSockFile* file ; file = new CSockFile( &sockRecv); //创建文件对象并关联到连接套接字对象。 ,6,CArchive* arIn, arOut; arIn = CArchive(&file, CArchive::load); // 创建用于输入的归档对象~ arOut = CArchive( &file, CArchive::store); // 创建用于输出的归档对象。 // 归档对象必须关联到文件对象。 ,7,arIn >> dwValue; // 进行数据输入。 adOut << dwValue; // 进行数据输出。输入或输出可以反复进行。 ,8,sockRecv.Close(); sockServ.Close(); // 传输完毕~关闭套接字对象。 2(客户端 ,1,CSocket sockClient; // 创建空的客户机端套接字对象。 ,2,sockClient.Create( ); // 创建套接字对象的底层套接字。 ,3,sockClient.Connect( strAddr, nPort ); // 请求连接到服务器。 ,4,CSockFile* file ; file = new CSockFile( &sockClent); //创建文件对象,并关联到套接字对象。 ,5,CArchive* arIn, arOut; arIn = CArchive(&file, CArchive::load); // 创建用于输入的归档对象~ arOut = CArchive( &file, CArchive::store); // 创建用于输出的归档对象。 // 归档对象必须关联到文件对象。 ,6,arIn >> dwValue; // 进行数据输入。 adOut << dwValue; // 进行数据输出。输入或输出可以反复进行。 ,7,sockClient.Close(); // 传输完毕~关闭套接字对象。 八、说明使用MFCAppWizard创建客户机端应用程序框架具体的步骤, 答:1(使用MFC AppWizard创建客户端应用程序框架。 创建的程序是一个基于对话框的Win32应用程序~将自动创建两个类~应用程序类CTalkcApp~对应的文件是talkc.h和talkc.cpp,对话框类CTalkcDlg~对应的文件是talkcDlg.h和talkcDlg.cpp。支持Windows Socket~使用共享的DLL实现MFC42.DLL。 2(为对话框界面添加控件对象 利用控件面板在程序的主对话框界面中添加相应的可视控件对象~然后修改控件的属性 3(为对话框中的控件对象定义相应的成员变量 4(创建从CAsyncSocket类继承的派生类 ,1,选择菜单“插入/新建类”~进入“New Class”对话~选择或输入以下信息: Class Type:选择MFC Class Class Infoumation下的Name: 输入CMySocket Class Infoumation下的Base class:选择CAsyncSocket 点击“OK”按钮~系统会自动生成CMySocket类对应的包含文件MySocket.h和MySocket.cpp文件~在VC界面的Class View中就可以看到这个类。 ,2,利用类向导ClassWizard为这个套接字类添加响应消息的事件处理成员函数~此程序中需要添加OnConnect~OnClose和OnReceive三个函数。 ,3,为套接字类CMySocket类添加一般的成员函数和成员变量。对这个套接字类~添加一个私有的成员变量~是一个对话框类的指针。private:CTalkcDlg * m_pDlg; 再添加一个成员函数:void SetParent(CTalkcDlg * pDlg); ,4,手工添加其他代码 对于MySocket.h~应在文件开头~添加对于此应用程序对话框类的声明:class CTalkcDlg; 对于MySocket.cpp~有四处添加: ? 应在文件开头~添加包含文件说明。这是因为此套接字类用到了对话框类的变量。 #include “TalkcDlg.h” ? 在构造函数中~添加对于对话框指针成员变量的初始化代码: CMySocket::CMySocket() { m_pDlg = NULL; } ? 在析构函数中~添加对于对话框指针成员变量的初始化代码: CMySocket::~CMySocket() { m_pDlg = NULL; } ? 为成员函数setParent和事件处理函数OnConnect~OnClose和OnReceive添加代码。 5(为对话框类添加控件对象事件的响应函数 6(为CTalkcDlg对话框类添加其它的成员函数和成员变量 成员变量:CMySocket m_sConnectSocket; //用来与服务器端连接的套接字。 成员函数:void OnClose(); void OnConnect(); void OnReceive(); 7(手工添加的代码 在CTalkcDlg对话框类的talkcDlg.h中添加对于MySocket.h的包含命令~来获得对于套接字支持: #include “MySocket.h” 在CTalkcDlg对话框类的talkcDlg.cpp中添加对于控件变量的初始化代码: // TODO: Add extra initialization here //用户添加的控件变量的初始化代码 BOOL CTalkcDlg::OnInitDialog() {m_strServName="localhost"; // 服务器名 = localhost m_nServPort=1000; // 服务端口 = 1000 UpdateData(FALSE); // 更新用户界面 //设臵套接字类的对话框指针成员变量 m_sConnectSocket.SetParent(this);} 8(添加事件函数和成员函数的代码 主要在CTalkcDlg对话框类的talkcDlg.cpp中和CMySocket类的Mysocket.cpp中~添加用户自己的事件函数和成员函数的代码。 9(进行测试。 九、说明点对点交谈的客户机端程序的类与消息驱动关系, 答: 下图说明了点对点交谈的客户端程序的类与消息驱动关系 第六章 1. 说明了各种HINTERNET句柄形成的树形体系 答: 2. 如何获取WinInet API函数执行的错误信息, 答:从函数的返回值来说~WinInet API主要有两种类型。一种函数的返回值类型是HINTERNET句柄型~一种函数的返回值类型是布尔型。应用程序可以根据函数执行后的返回值来判断函数的执行是否成功。 对于前一种函数~当函数执行成功时~会返回一个有效的句柄,当函数失败时~则返回NULL。 对于后一种函数~当函数执行成功时~返回TRUE,当函数失败时~返回FALSE。 在函数调用失败后~用户往往需要了解出错的具体原因~应用程序可以随即调用GetLastError函数来获取更具体的错误信息。 3、说明使用WinInet API编制FTP客户机端应用程序的一般步骤 答:,1,调用InternetAttemptConnect函数测试主机与Internet的连接状态~ ,2,调用InternetOpen函数~创建HINTERNET会话根句柄。 ,3,创建FTP会话句柄 4、MFC WinInet所包含的类有哪些, 答:1、CInternetSession类~2(连接类~包括CInternetConnection类和它的派生类CFtpConnection类、CHttpConnection类、和CGopherConnection类,3文件类~首先包括CInternetFile类和由它派生的CHttpFile类和CGopherFile类~另外~由CFileFind类派生的用于文件查找的CFtpFileFind类和CGopherFileFind类也应归入文件类的层 次。4(CInternetException类 5、MFC WinInet 各种类之间的关系 答:如下图~其中细线箭头从基类指向继承类~表示了类的派生关系,粗线箭头从函数指向它所创建的类对象 6、使用WinInet类编程的一般步骤是什么, 答:1,创建CInternetSession类对象~创建并初始化Internet会话。 ,2,利用CInternetSession类的QueryOption或SetOption成员函数~可以查询或设臵该类内含的Internet请求选项~这一步是可选。 ,3,创建连接类对象~建立CInternetSession对象与网络服务器的连接~也就是应用程序与网络服务器的连接。 ,4,创建文件检索类对象~对服务器进行检索 ,5,如果需要使用异步操作模式~可以重载CInternetSession类的OnStatusCallback 函数~并启动应用程序使用状态回调机制。重载相关函数~加入自己的代码。 ,6,如果还想更紧密地控制对于服务器文件的访问~可以进一步创建文件类对象实例~完成文件查找或文件读写操作。 ,7,创建CInternetException类对象实例~处理错误。 ,8,关闭各种类~将资源释放给系统。 第七章 1、 WinSock的两种I/O模式是什么,各有什么优缺点~缺点如何解决, 答:WinSock的两种I/O模式是:“阻塞”模式,Blocking Mode,或“非阻塞”模式~又称为同步模式或异步模式。 阻塞模式的优点:阻塞套接字的I/O操作工作情况比较确定~无非是调用、等待、返回。大部分情况下~I/O操作都能成功地完成~不过就是花费了等待的时间。因而比较容易使用~容易编程。 缺点:在应付诸如需要建立多个套接字连接来为多个客户服务的时候~或在数据的收发量不均匀的时候~或在输入输出的时间不确定的时候~却显得性能低下~甚至无能为力。 非阻塞模式的优点:能应付诸如需要建立多个套接字连接来为多个客户服务~可以处理数据的收发量不均匀、输入输出的时间不确定等问题。 非阻塞模式的缺点:用非阻塞套接字~需要编写更多的代码~因为必须恰当地把握调用I/O函数的时机~尽量减少无功而返的调用~还必须详加分析每个Winsock调用中收到的WSAEWOULDBLOCK错误~采取相应的对策~这种I/O操作的随机性使得非阻塞套接字显得难于操作。 解决方法:对于非阻塞的套接字工作模式~进一步引入了五种“套接字I/O模型”~有助于应该程序通过一种异步方式~同时对一个或多个套接字上进行的通信加以管理。 对于阻塞的套接字工作模式~则进一步引入了多线程机制。 2、 简述Win32操作系统下的多进程多线程机制。 答:Win32操作系统还支持同一进程的多线程。在一个Windows进程内~可以包含多个线程。一个线程(thread)是进程内的一条执行路径~具体地说~是一个应用程序中的一条可执行路径~往往是应用程序中的一个或多个函数。一个进程中至少要有一个线程~习惯将它称为主线程。任何一个应用程序进程都有一个主线程。 多线程机制在网络编程中如何应用, 3、 答:如果一个应用程序~有多个任务需要同时进行处理~那就最适合使用多线程机制。对于网络上客户机软件~采用多线程的编程技术~能克服在单线程的编程模式下~由于阻塞等待而产生的客户程序就不能及时响应用户的操作命令的问题。对于网络上服务器软件~采用多线程的编程技术~能更好地为多个客户服务。即便是对于一个客户~采用多线程机制也能大大提高应用程序的运行效率。 4、 说明用户接口线程和工作线程的概念和特点。 答:用户接口线程:通常用来处理用户输入产生的消息和事件~并独立地响应正在应用程序其它部分执行的线程们产生的消息和事件。用户接口线程包含一个消息处理的循环~以应对各种事件。 工作线程:适用于处理那些不要求用户输入并且比较消耗时间的其他任务。对用户来说~工作线程运行在后台。这就使得工作线程特别适合去等待一个事件的发生。 5、 简述创建MFC的工作线程所必需的步骤。 答:,1,是编程实现控制函数。 ,2,是创建并启动工作线程。 ,3,创建工作线程的。 ,4,创建工作线程的一般模式。 6、简述创建并启动用户界面线程所必需的步骤。 答:1(从CWinThread类派生出自己的线程类 2(改造自己的线程类 3(创建并启动用户界面线程 7、如何正常终止线程,如何提前终止线程, 答:正常终止线程:执行完毕时退出控制函数~并返回三个用来表示终止原因的值即可。 提前终止线程:从线程内调用AfxEndThread函数~就可以强迫线程终止。 第八章 1、非阻塞套接字的五种“套接字I/O模型”: select,选择,、 WSAAsyncSelect,异步选择,、 WSAEventSelect,事件选择,、 Overlapped I/O,重叠式I/O, 以及Completion port,完成端口,。 2、select模型的操作步骤 select,选择,模型是Winsock中最常见的I/O模型。它的中心思想是利用select函数~实现对多个套接字I/O的管理。 用select操作一个或多个套接字句柄~一般采用下述步骤: ,1,使用FD_ZERO宏~初始化自己感兴趣的每一个fd_set集合。 ,2,使用FD_SET宏~将要检查的套接字句柄添加到自己感兴趣的每个fd_set集合中~ 相当在指定的fd_set集合中~设臵好要检查的I/O活动。 ,3,调用select函数~然后等待。select完成返回后~会修改每个fd_set结构~删除那些不存在待决I/O操作的套接字句柄~在各个fd_set集合中返回符合条件的套接字。 ,4,根据select的返回值~使用FD_ISSET宏~对每个fd_set集合进行检查~判断一个特定的套接字是否仍在集合中~便可判断出哪些套接字存在着尚未完成,待决,的I/O操作。 ,5,知道了每个集合中“待决”的I/O操作之后~对相应的套接字的I/O进行处理~然后返回步骤1~继续进行select处理。 3、WSAAsyncSelect异步I/O模型的编程步骤 ?用CreateWindow函数创建一个窗口~并为该窗口提供一个窗口回调例程。 ?调用WSAAsyncSelect函数创建套接字~指定关注的套接字、窗口句柄、打算接收的消息~以及程序感兴趣的套接字事件。成功执行WSAAsyncSelec函数~就打开了窗口的消息通知~并注册了事件。 ?WSAAsyncSelec函数执行时~当注册的套接字事件之一发生时~指定的窗口会收到指定的消息~并自动执行该窗口的回调例程~可在其中添加自己的代码~处理相应的事件。 4、WSAEventSelect事件选择模型的编程步骤 ?创建事件对象句柄 事件选择模型要求应用程序针对每一个套接字~首先创建一个事件对象。创建方法是调用WSACreateEvent函数~定义如下: WSAEVENT WSACreateEvent(void); ?关联套接字和事件对象~注册关心的网络事件 将事件对象句柄与某个套接字关联在一起~同时注册感兴趣的网络事件类型。调用WSAEventSelect函数~函数的定义为: int WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents ); ?等待网络事件触发事件对象句柄的工作状态 调用WSAWaitForMultipleEvents函数~等待网络事件触发事件对象句柄的工作状态。该函数的定义: DWORD WSAWaitForMultipleEvents( DWORD cEvents, const WSAEVENT FAR * lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable ); ?检查套接字上所发生的网络事件类型 调用WSAEnumNetworkEvents函数~检查套接字上发生了什么类型的网络事件。该函数定义如下: int WSAEnumNetworkEvents( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ); ?处理网络事件 在确定了套接字上发生的网络事件类型后~可以根据不同的情况做出相应的处理。完成了对WSANETWORKEVENTS结构中的事件的处理之后~应用程序应在所有可用的套接字上~继续等待更多的网络事件。 应用程序完成了对一个事件对象的处理后~便应调用WSACloseEvent函数~释放由事件句柄使用的系统资源。函数的定义如下: BOOL WSACloseEvent(WSAEVENT hEvent); 该函数也将一个事件句柄作为自己唯一的参数~并会在成功后返回TRUE~失败后返回FALSE。 第九章 1、什么是HTTP会话,HTTP会话周期由哪些阶段组成, HTTP是超文本传输协议,Hypertext Transfer Protocol,的简称~HTTP协议也是基于TCP/IP的客户/服务器协议。主要是用于传输文件的协议。 HTTP会话周期由连接、请求、响应和断开4个阶段组成。 ?建立TCP/IP连接 ?Web客户机向服务器发送HTTP请求 ?服务器向客户机回送HTTP响应 ?断开TCP/IP连接 2、CHtmlView类的继承关系 3、利用MFC AppWizard创建SDI或MDI的步骤 ,1,第一步:选择应用程序结构 ?为应用程序选择三种结构之一~单文档,Single Document SDI,~多文档,Multiple Document MDI,~基于对话框,Dialog Based,。Web浏览器型的应用程序一般选择SDI类型~以下的操作都假定选择了SDI类型。 ?决定应用程序是否要支持MFC的文档/视图结构,document/view architecture,~实际上必须选择支持~因为不支持文档/视图结构的应用程序不能打开磁盘文件和从CWnd类继承的窗口区~并且后面的步骤都是无效的。 ?选择资源中的文本所使用的语言~应选择“中文[中国]” 作完这三件事以后~点击Next按钮 ,2,第二步:选择应用程序支持的数据库 ?为程序选择一种数据库支持~有四个选项。没有,None,, 头文件支持,Header file support,, 带有文件支持的数据库视图,Database View with file support,或没有文件支持的数据库视图, Database View without file support,。 ?如果选择了数据库支持~点击数据源,Data Source,~在外部ODBC数据库、DAO数据库和OLE DB数据库中选择一个~然后选择相应的数据源和数据库表选项。 ?点击Next按钮~出现第三步对话框 ,3,第三步:选择应用程序支持的复合文档 ?选择应用程序支持的复合文档,compound document,类型。有五个选项: None:不支持复合文档 Container:容器~一个OLE 2.0风格的文档容器。 Mini-server:最小服务器~一个OLE服务器~但不能作为一个独立的程序来运行。 Full-server:完全服务器~一个OLE服务器~可以作为独立程序运行。 Both container and server:容器和服务器两者。 ?也可以选择选项来启用标准的ActiveX资源~增加额外的自动命令到应用程序的菜单条中。 ?点击Next按钮~出现第四步对话框~ ,4,第四步:选择应用程序的接口特性 ?为程序选择基本的用户接口特性。如快捷的工具条、初始状态栏、打印和打印预览、内容敏感的帮助、3D控件、Windows套接字等~都是复选框。 ?要使用的工具条形式~IE4.0 ReBars或者MFC常规的工具条。 ?最近打开的文件列表数目~默认值是4。 ?如果你想要修改你的程序的名字和扩展名~或者为你的程序调整用户接口窗口框架风格~点击Advanced。 ?点击Next~出现第五步对话框。如图9.9所示。 ,5,第5步:决定三个问题 ?选择工程风格: Windows Explorer:左边是一个树形视图~右边是一个列表视图。 MFC Standard:为文件视图提供一个区域。 ?选择是否希望应用程序向导在源文件中产生注释~以便指导你编写程序。 ?选择使用MFC库的选项 As a shared DLL:库作为共享的DLL As a statically linked library:库作为静态链节的DLL 注意~静态链接到MFC的库仅仅在VC++的专业版和企业版中支持,Professional and Enterprise Editions,。 ?点击Next~出现MFC AppWizard – Step 6 of 6对话框。如图9.10。 ,6,第6步:决定类名和基类 ?如果你想要改变默认的由应用程序向导提供的类名~基类~头文件~或者实现文件的名字~输入新的名字~要改变基类~选择你的程序的视图类。 .11。说明了应用程?点击Finish按钮~出现New Project Information对话框。如图9序的类型~创建的类、应用程序的特性和工程的目录。 ?点击OK按钮~工程创建成功~进入VC++集成的开发环境。 4(创建一个Web浏览器型的应用程序的一般步骤 ?利用MFC AppWizard生成应用程序框架 生成的工程框架包含四个类: 应用程序类~CMyWebApp~对应myWeb.h和myWeb.cpp文件。 框架类~CMainFrame~对应MainFrm.h和MainFrm.cpp文件。 文档类~CMyWebDoc~对应myWebDoc.h和myWebDoc.cpp文件。 HtmlView类~CMyWebView~对应myWebView.h和myWebView.cpp文件 ?修改菜单 修改菜单~添加用户需要的功能条目。在工作区中选择ResourceView卡~选择Menu~双击菜单控件的名字,IDR_MAINFRAME,。 ?修改工具栏 在工具栏上增加新的按钮~以便快速执行所需的功能。在工作区中选择ResourceView卡~选择ToolBar~双击工具条控件的名字,IDR_MAINFRAME,~ ?为控件添加事件处理函数 当用户点击菜单条目~或者点击相应的快捷按钮时~应能引起程序的反映~这就需要给这些控件添加事件处理函数。进入类向导~选择“Message Maps”卡。在“Class Name”下拉框中选择CMyWebView类~ ?添加事件处理函数的代码 ?为应用程序添加URL定位功能 ?解决点击超链接时地址栏的同步问题 第十章 1、简述电子邮件系统的构成。 答:一个电子邮件系统包括三个主要的构件~即用户代理~邮件消息传输代理~和电子邮件使用的协议。 2、说明电子邮件的发送和接收的过程。 答: ,1, 甲运行Foxmail软件~进入它的窗口用户界面~利用其中发信代理的相关功能~编 辑要发送的邮件内容。然后~填好收信人的电子邮箱地址、邮件主题等信息~单击 “发送”按钮。 ,2, Foxmail软件中的SMTP客户机进程向网易网站的SMTP服务器发出连接请求~经过 三次握手的过程建立了TCP连接。然后进入SMTP客户机与SMTP服务器的会话过程~ 通过网络~smtp客户机发出请求命令~SMTP服务器以响应作答。 ,3, 一旦收到了邮件~就立即按照该邮件收件收信人的电子邮箱地址~向网站的SMTP 服务器进程发起建立TCP连接的请求。经过SMTP客户机与服务器的会话过程~将 邮件从发送站点传到接收站点~接收站点的服务器将邮件存放到乙的电子邮箱中~ 等待乙来读取。 ,4, 当乙读取邮件时~Foxmail软件中的POP3客户机进程立即向接收站点的POP3服务 器进程发出请求~建立TCP连接~然后~按照POP3~进入POP3会话过程~将邮件 或邮件的副本从位于接收的电子邮箱取出~发送到乙的pc. ,5, 乙方Foxmail中的收信代理向用户显示邮件~乙可以利用它的相关功能对此邮件做 进一步处理。 3、电子邮件系统有什么特点, 答:?是一种异步的通信系统~不像电话~通话的双方都必须在场。 ?使用方便~传输迅速~费用低廉~不仅能传输文字信息~还能附上声音和图像。 ?在电子邮件系统的实现中~ISP的服务器必须7X24小时地不间断地运行~这样才能保 证用户可以随时发送和接收信件~而发送或接收电子邮件的用户则随意。 4、简述SMTP客户机与SMTP服务器之间的会话过程~以及SMTP会话具有的特点。 答:如下图:说明了SMTP客户与SMTP服务器之间的会话过程 SMTP会话具有以下特点: ,1,会话的过程采用交互式的请求应答模式~客户发送命令~服务器回送应答。 ,2,客户发送的命令和服务器回送的应答都是纯文本形式~有一定格式。 ,3,针对客户的每个命令~服务器总要返回一定的响应码~表示服务器是否接受或执行了客户端命令。 ,4,会话过程有一定的顺序 5、使用WinSock来实现电子邮件客户机程序与服务器的会话的步骤是什么, ,启动SMTP服务器~在指定的传输层端口监听客户端的连接请求~为SMTP服务答:,1 器保留的端口是25。 ,2,客户端设臵Winsock连接的IP地址或域名~指定端口号~主动发出连接请求~连接到SMTP服务器。比如~网易的SMTP服务器的域名是smtp.163.com~监听端口是25。 ,3,服务器接收客户端的连接请求~并发回响应。客户端应收到类似220 BigFox ESMTP service ready这样的信息, 这就说明客户端已经与服务器建立TCP/IP连接~成功地实现了第一步。 ,4,客户端和服务器分别向对方发送数据。 ,5,客户端或服务器分别读取自己缓冲区中的数据。 ,6,以上两步是SMTP会话的主要部分~要按照SMTP协议的规定~按照一定顺序~客户向服务器发送命令~服务器向客户发送应答~以上两步要多次重复。 ,7,会话完毕~关闭客户端和服务器之间的连接。 6、说明电子邮件信件结构。 答:从组织上看~RFC822将电子邮件信件内容结构分为信头和信体两大部分~中间用一个空白行,只有CRLF符的行,来分隔。第一部分称为信件的头部~包括有关发送方、接收方和发送日期等信息。第二部分称为信件的体部~包括信件内容的正文文本。信头是必须的~信体是可选的~即信体可有可无。 7、建议的使用在信头中的字段顺序是什么, 答:一般来说~信头中的字段不要求任何特定的顺序~但Received、Return-Path和Resent-*字段例外。Received字段是在信件传送过程中~由经过的一系列的MTA投递前增加的~必定放在信件的开始。Return-Path字段只是在最后一个MTA投递前增加的~也放在信件的开始。因为这两类字段是为诊断问题提供跟踪信息的~所以它们的位臵必须保持不变。另外~给信件增加的任何重发字段~即以Resent-前缀开头的字段也必须放在信件的开始。 8、说明MIME的基本思想。 答:MIME的基本思想是:第一~不改动SMTP和POP3等电子邮件传输协议,第二~仍然要继续使用RFC822的格式来传输邮件。 9、说明Base64编码算法。 答:在进行Base64的编码时~首先要将被编码的数据看成一个字节序列~不分行。然后按照以下三个步骤反复进行编码。 第一步:顺次从要编码的字节序列数据中~取出3个字节~作为一组~该组包含24bit。 第二步:将一组的24个bit~再顺次分为四个6bit的小组。并在每小组的前面补两个零~形成四个字节。显然这4个字节的值都在0-63范围内。 第三步:根据小组的每个字节的数值~按照表10.4的对应关系~将它们分别转换为对应的可打印ASCII字符。 顺次对要编码的数据字节序列~重复进行以上处理~直到所有的数据编码完成为止。 10、说明Quoted-printable编码算法。 答:这种编码称为可打印的引用编码(Quoted-printable encoding)~被编码的数据以8BIT的字节为单位~这种编码方法的要点就是对于所有可打印的ASCII码~除了特殊符号“=”以外~都不改变。编码算法的要点是: ,1,如果被编码数据字节的值在33到60之间(字符!至字符<)~或在62到126之间(字符>至字符~)~这部分字符是可打印的~则该数据字节编码为7bit的对应ASCII字符~实际就是将最高位去掉。 ,2,其他的数据~包括“=”字符~空格~ASCII码在0-32的不可打印字符~以及非ASCII码的数据~都必须进行编码。被编码的数据以8bit的字节为单位~先将每个字节的二进制代码用两个16进制数字表示~然后在前面加上一个等号“=”~就是该字节的编码。 ,3,如果要将编码后的数据分割成76字符的行~可以在分割处插入等号“=”和CRLF。此等号也要计算在76个字符中。 11、简述POP3会话的3个状态。 答:POP3会话一共有3个状态:验证状态~事务状态和更新状态。每个状态都是会话过程中的特定阶段。 当连接服务器后~POP3会话首先进入验证状态~在这个阶段里~可以使用USER Pass Quit这三个POP3命令~客户段送交用户名和口令~服务器验证是否合法。 通过服务器验证后~服务器锁定该用户的信箱~从而防止多个POP客户端同时对此邮箱进行邮件操作~比如删除~取信等。但是可以让新的邮件加入。这时会话过程转变为事务状态~在事务状态客户端可用的POP3命令有:Noop Stat Quit List Retr Top Dele Rset Uidl。使用这些命令进行各种邮件操作~POP对话的大部分时间都处在事务状态中。 当客户发出Quit命令后~结束事务状态~POP会话过程进入更新状态。在事务状态进行的一些操作~最终在更新状态中才得以体现。比如在事务状态使用Dele命令删除邮件~实际服务器并没有将邮件删除~只是做了一个删除标志,到了会话过程的更新状态~邮件才被删除。更新状态只是会话中的一个过程~该状态没有可使用的命令~目的是用户在事务状态后用以确认已经进行的操作。在进入该状态后~紧接着就完成了POP3的会话过程~断开了与服务器的连接。要注意~由于异常原因导致的与服务器终止对话并没有进入更新状态。在事务状态删除的邮件没有被删除~下次进入信箱时邮件还是存在的。 12、接收电子邮件编程的一般步骤是什么。 答:首先利用Winsock连接上POP3服务器~然后: 1(使用USER命令发送用户信箱名。 2(使用PASS命令发送信箱密码。如果密码和信箱不匹配~必须从上一步骤重新开始。 3(对信箱邮件进行操作。 此阶段称为事务状态~在这一个阶段~有许多POP3命令可以使用~大体分为下面几类: ,1,取得信箱及邮件状态的命令 Stat:取得信箱大小信息 List:取得邮件大小信息 Uidl:取得邮件的唯一标识符。 ,2,取得邮件内容的命令 Retr:从服务器取回邮件 TOP: 取邮件信头和信体的前N行。 ,3,对邮件进行操作的命令 Dele:为邮件做删除标记。 Rset:复位POP会话。 4(接收邮件完毕~发送QUIT命令~结束POP3对话。
/
本文档为【网络编程实用教程课后习题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索