1)投票协议标识 2)投票消息类型 3)投票候选人标识 4)投票结果
使用文本串和二进制两种方式设计投票消息以满足以上需求。
解答:基于文本串的消息描述方式需要定义一些固定含义的文本串来标识消息内容。比如:“VOT”指明投票协议,“TYPE:”指明消息类型,“CANDIDATE:”指明候选人,“RESULT:”指明结果。则一个具体的消息可以表示为由消息标识声明的文本串,如“VOT TYPE:2;CANDIDATE:peter;RESULT:true”,假设投票消息传送协议基于TCP协议承载,在具体传输过程中,使用一种编码方式(如:Unicode编码)对该文本串进行描述,并作为TCP协议的数据部分传输。
基于二进制的消息描述方式使用固定大小的数据区域存储消息内容,比如设计投票消息传送协议格式如下:
015协议标识消息类型候选人标识投票结果
定义:协议标识0x01代表投票协议 消息类型0x02代表投票消息
候选人标识0x05代表候选人“peter”的唯一标识 投票结果0x01代表投票,0x02代表反对
那么一次对候选人peter的赞成投票的投票消息为:0x01020501.
假设投票消息传送协议基于TCP协议承载,在具体传输过程中,二进制描述的投票消息可以直接作为TCP协议的数据部分传输。
第四章 协议软件接口
习题
1. 阐述使用Windows Sockets编程的环境配置过程。
解答:Windows Sockets实现一般由两部分组成:开发组件和运行组件。
开发组件是供程序员开发Windows Sockets应用程序使用的,它包括介绍Windows Sockets实现的文档、Windows Sockets应用程序接口(API)引入库和一些头文件。头文件winsock.h、winsock2.h分别对应于WinSock 1.1和WinSock2.2,是Windows Sockets最重要的头文件,它们包括了Windows Sockets实现所定义的宏、常数值、数据结构和函数调用接口原型。
运行组件是Windows Sockets应用程序接口的动态链接库(DLL),应用程序在执行时通过装入它实现网络通信功能。两个版本的动态链接库以及与其对应的接口引入库和头文件如下所示。
表4-1 Windows Sockets 版本中相应的动态链接库
版本 1.1 2.2 头文件 winsock.h winsock2.h 静态链接库文件 winsock.lib ws2_32.lib 动态链接库文件 winsock.dll ws2_32.dll 对动态链接的使用,需要在程序编译前将对应的头文件引入源文件,以便编译环境可以找到相应函数和变量的声明,并在项目中引入静态链接库文件,以便在程序编译通过后,连接时可以找到套接字函数的执行地址。
以Windows Sockets 2.2版本为例,对头文件的引入使用以下代码段: #include “winsock2.h”
对静态链接库的引入使用以下代码段: #pragma comment(lib,\
或者在开发环境中的项目菜单中配置增加对“ws2_32.lib”文件的引入,如下图所示。
2. 考虑一种提供消息传递的操作系统,阐述如何扩展应用程序接口使其适用于网络通信?
解答:提供消息传递的操作系统典型的例子是Windows操作系统,该系统最大的特点是图形化的操作界面,其图形化界面是建立在消息处理机制这个基础之上的。程序不断等待,等待任何可能的输入,然后做判断,根据不同的消息调用消息处理函数进行适当的处理。这种输入是操作系统捕捉到后以消息形式(一种数据结构)进入程序之中的。
有了消息机制的推动,套接字接口也可以借助消息机制来通知应用程序网络事件满足,具体思路是:首先为应用程序创建消息传递所需的消息接收窗口和消息队列;然后定义与网络事件相关联的消息;之后通过系统调用注册网络事件与消息的对应关系;最后,当网络事件发生时,系统触发消息通知应用程序处理。通过以上基本步骤实现了基于消息机制的异步网络操作。
3. 阐述程序、套接字、端口和协议之间的关系。
解答:程序和套接字的关系:一个程序可以同时使用多个套接字,不同套接字完成不同的传输任务。多个应用程序可以同时使用同一个套接字,不过这种情况并不常见。
套接字和端口的关系:每个套接字都有一个关联的本地TCP或UDP端口,它用于把传入的分组指引到应该接收它们的应用程序。一个端口上可能关联多个套接字,流式套接字的
服务器上可能同时有监听套接字和连接套接字,它们都与一个TCP的端口号相关联;一个套接字一般只会关联一个唯一的本地端口号。
端口和协议的关系:TCP和UDP的端口号是独立使用的。
实验
1.调用Windows Sockets的API函数获得本地主机和远端域名的IP地址,如果一个主机名称对应了多个IP地址,请依次打印。
解答:实现过程具体见《Windows网络编程实验》。
第五章 流式套接字编程
习题
1. 思考套接字接口层与TCP实现之间的关系,结合数据发送和接收分析数据的传递过程以及两个层次的具体工作。
解答:对应于TCP数据的发送和接收,套接字实现设计了两个独立的缓冲区,分别用于缓存应用程序请求发送的数据和等待接收的数据(一般以先进先出队列的形式保存)。
从应用程序实现、套接口实现和协议实现三个层次来观察数据发送的过程,数据发送在实施过程中主要涉及到两个缓冲区:一个是应用程序发送缓冲区,即调用send()函数时由用户申请并填充的缓冲区,这个缓冲区保存了用户即将使用协议栈发送的TCP数据;另一个是TCP套接口的发送缓冲区,在这个缓冲区中保存了TCP协议尚未发送的数据和已发送但未得到确认的数据。数据发送涉及到两个层次的写操作:从应用程序发送缓冲区拷贝数据到TCP套接口的发送缓冲区,和从TCP套接口的发送缓存将数据发送到网络中。
数据接收在实施过程中主要涉及到另外两个缓冲区,一个是TCP套接口的接收缓冲区,在这个缓冲区中保存了TCP协议从网络中接收到的与该套接口相关的数据;另一个是应用程序的接收缓冲区,即调用recv()函数时由用户分配的缓冲区,这个缓冲区用于保存从TCP
套接口的接收缓存收到并提交给应用程序的网络数据。数据接收也涉及到两个层次的写操作:从网络上接收数据保存到TCP套接口的接收缓冲区,和从TCP套接口的接收缓冲区拷贝数据到应用程序的接收缓冲区中。
2. 在基于流式套接字的网络应用程序设计中,假设客户端以8字节-12字节-8字节-12字
节的顺序交替发送数据给服务器,请思考,服务器的接收操作每次能够接收到多少字节的数据?为什么?
解答:服务器接收操作每次能够接收到的数据长度是不确定的,这是因为TCP传送数据的形态是没有间隔的字节流,数据接收仅与接收调用的时间和当前主机内核缓存中尚未提交应用程序的数据有关,与发送端发送多少次和TCP如何传送没有直接的关系,我们不能准确地预测一个特定的接收操作到底返回多少字节。
3. 思考使用TCP进行数据传输的应用程序是否一定不会出现数据丢失?应用程序应在哪
些具体操作上考虑可靠性问题?
解答:使用TCP进行数据传输的应用程序也可能会出现数据丢失,这是因为TCP是一个端到端的协议,这意味着通信的双方只关心自己提供了一个可靠的传输机制,“端”是对等方的TCP协议实现,而不是对等方的应用程序。应用程序的可靠性需要应用程序自己提供。
导致TCP传输出现失败的现象有:在正常的TCP连接上,TCP确认的数据实际上有可能不会到达它的目的应用程序,服务器的TCP实现不确认接收到了数据,如:发生永久的或暂时的网络紊乱,对等方的应用程序崩溃,对等方的应用程序运行的主机崩溃等。
网络程序设计人员应注意到这些失败模式对TCP应用程序的影响,在数据发送、接收、连接关闭等操作上,注意函数调用时机,关注函数调用结果,尽可能全面地处理TCP传输中可能遇到的失败模式。
实验
1. 使用流式套接字编程设计一个并发的回射服务器,该服务器具有并发处理客户请求的功
能,当多个客户端同时请求服务器回射时,服务器能够同时接收到多个客户端的请求并相应做出回射响应。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Windows网络编程基础-习题解答(2)在线全文阅读。
相关推荐: