解答:实现过程具体见《Windows网络编程实验》。
2. 设计一个网络测试程序,客户端能够模拟“发送-发送-……-接收”的操作序列,采用send()和WSASend()两种发送方式进行请求发送,测试在这两种发送操作下服务器的响应时间有何差别,并说明原因。
解答:实现过程具体见《Windows网络编程实验》。
第六章 数据报套接字编程
习题
3. 思考套接字接口层与UDP实现之间的关系,结合数据发送和接收分析数据的传递过程以及两个层次的具体工作。
解答:数据发送过程和接收过程类似,以数据接收为例,从应用程序实现、套接口实现和协议实现三个层次来观察接收的过程,数据接收在实施过程中主要涉及到两个缓冲区,一个是UDP套接口的接收缓冲区,在这个缓冲区中保存了UDP协议从网络中接收到的与该套接口相关的数据;另一个是应用程序的接收缓冲区,即调用recvfrom()函数时由用户分配的缓冲区recvbuf,这个缓冲区用于保存从UDP套接口的接收缓存收到并提交给应用程序的网络数据。数据接收涉及到两个层次的写操作:从网络上接收数据保存到UDP套接口的接收缓冲区,和从UDP套接口的接收缓冲区拷贝数据到应用程序的接收缓冲区中,如下图所示。
应用程序接收缓存拷贝 应用程序实现recvfrom()UDP套接口接收缓存 套接口实现接收 UDP协议实现
4. 在基于数据报套接字的网络应用程序设计中,假设客户端向服务器发送了两个数据报,
一个报文长度为800字节,另一个报文长度为1200字节,设置服务器端的接收缓冲区为1000字节,进行三次接收操作,请思考,服务器在三次接收操作时各发生何种现象,实际接收到的字节长度为多少?
解答:第一次接收操作接收到完整的800字节的报文,recvfrom()函数返回800; 第二次接收操作接收1000字节的报文,recvfrom()函数返回1000,第二个报文后续的200字节内容被截断丢弃;
第三次接收操作依赖于套接字的工作模式,如果是阻塞模式,则接收函数阻塞,如果设置了接收超时,则在超时时间到时返回接收超时错误;如果是非阻塞模式,则接收函数立刻返回,错误类型是WSAEWOULDBLOCK.
5. 总结使用UDP进行数据传输的应用程序应在哪些具体操作上考虑可靠性问题?
解答:由于UDP协议是一个不可靠的协议,使用UDP进行数据传输的应用程序会因为网络环境、主机环境的差异带来数据传递过程中发生丢失、乱序、重复等问题,那么在程序运行过程中需要考虑:
发送操作:发送出去的数据可能会丢失,需要考虑超时重传问题;发送目的地可能并不存在,需要判断目的应用程序的状态。
接收操作:接收到的数据可能重复,需要判断重复数据;接收到的数据可能是噪音,需
网络要排除噪音;接收到的数据可能乱序,需要考虑重组;可能无法接收到预期的数据,需要考虑反馈确认和流量控制问题。
实验
1. 设计一个网络测试程序,客户端能够高速发送数据,服务器端接收数据并统计接收到的
数据报文个数,测试当前系统和网络环境下,服务器的丢包率为多少?
解答:实现过程具体见《Windows网络编程实验》。
2. 在上题的测试程序基础上,修改系统接收缓存,测试系统接收缓存的大小与程序丢包率之间的关系,并解释原因。
解答:实现过程具体见《Windows网络编程实验》。
第七章 原始套接字编程
习题
1. 原始套接字在处理数据发送和接收时与流式套接字和数据报套接字有哪些不同?
解答:在使用原始套接字进行数据传输的编程过程中,增加了诸多操作,如套接字选项的设置、传输协议首部的构造、网卡工作模式的设定以及接收数据的过滤与判断等。
使用原始套接字发送数据需要填写的数据内容更加复杂,根据应用的不同,原始套接字可以有两种数据填充的选择:仅构造IP数据或构造IP首部和IP数据。此时程序设计人员需要根据实际需要对套接字选项IP_HDRINCL进行配置。
使用原始套接字接收数据时,网络接口提交给原始套接字的数据并不一定是网卡接收到的所有数据,如果希望得到特定类型的数据包,应用程序需要对套接字的接收进行控制,设定接收选项SIO_RCVALL,或者通过bind()、connect()函数明确端点地址。由于原始套接字的数据传输也是无连接的,网络接口提交给原始套接字的数据很可能存在噪音,因此在接收到数据后,需要对数据进行一定条件的过滤。
2. 某程序员在Windows 7环境下,使用原始套接字构造TCP的SYN请求实现半开端口
扫描,但结果发现网络中并没有看到SYN请求的发送,请分析原因并给出解决思路。
解答:在Windows环境下,原始套接字的支持一直是个备受争议的问题,不同版本的Windows环境对原始套接字给出了一些限制。在Windows7、Windows Vista、Windows XP SP2和Windows XP SP3中,通过原始套接字发送数据的能力受到了诸多限制,其中对TCP的限制是TCP的数据不能通过原始套接字发送。
因此,如果仍要在Windows7环境下开发SYN半开端口扫描,那么需要选择其它的编程方法,如WinPcap编程。
实验
1. 使用原始套接字编程,实现UDP回射客户端的主要功能。该客户端具备IP原始数据包
的构造、发送和接收功能,能够从控制台获取用户输入,将用户输入的字符串作为UDP的数据填充回射请求,发送给回射服务器,接收服务器发回的响应,并将响应打印到命令行中。
解答:实现过程具体见《Windows网络编程实验》。
2. 设计一个路径探测器,能够实现类似于traceroute功能,获取从探测源到达目的主机的路由器路径和延迟。
解答:实现过程具体见《Windows网络编程实验》。
第八章 网络通信中的I/O操作
习题
1. 简述阻塞与非阻塞、同步与异步的区别。
解答:同步和异步概念与消息的通知机制有关。对于消息处理者而言,在同步的情况下,由处理消息者自己去等待消息是否被触发;在异步的情况下,由触发机制来通知处理消息者,然后进行消息的处理。同步和异步仅仅是关于所关注的消息如何通知的机制,而不是处理消息的机制。
阻塞和非阻塞与消息的处理机制有关。阻塞模式是指在指定套接字上调用函数执行操作时,在没有完成操作之前,函数不会立即返回。非阻塞模式是指在指定套接字上调用函数执行操作时,无论操作是否完成,函数都会立即返回。
同步与阻塞,异步与非阻塞并不是两对相同的概念,要注意消息的通知和消息的处理是不同的。
2. 简述WSAAsyncSelect模型和WSAEventSelect模型的主要区别和各自在使用中的优缺点。
解答:WSAAsyncSelect模型和WSAEventSelect模型都是Windows Sockets引入的异步处理网络I/O的基本方法。WSAEventSelect模型与基于WSAAsyncSelect的异步I/O模型的最主要的区别是网络事件发生时系统通知应用程序的方式不同。WSAAsyncSelect模型依赖消息通知,而WSAEventSelect模型允许在多个套接字上接收以事件为基础的网络事件的通知。
WSAAsyncSelect模型基于Windows消息机制实现,其优点是:在系统开销不大的情况下可以较简单地同时处理多个客户端的网络I/O。其缺点是:消息的运转需要有消息队列,为了支持消息机制,就必须创建一个窗口来接收消息,另外,在一个窗口中处理大量的消息也可能成为性能的瓶颈。
WSAEventSelect模型不依赖于消息,所以可以在没有窗口的环境下比较简单地实现对网络通信的异步操作。该模型的缺点是等待的事件对象的总数是有限制的(每次只能等待64个事件),在有些应用中可能会因此受到限制。
3. 假设某Web服务器使用TCP协议通信,在同一时间会有上万个客户端同时在线访问,
试选择一种网络I/O通信的模型,使其能够充分发挥服务器所在系统的性能,并阐明原因。
解答:选择使用完成端口模型处理网络I/O,该模型内部提供了线程池的管理,可以避免反复创建线程的开销,同时可以根据CPU的个数灵活地决定线程个数,减少线程调度的次数,从而提高了程序的并行处理能力。由于其稳定、高效的并发通信能力,该模型适合于
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Windows网络编程基础-习题解答(3)在线全文阅读。
相关推荐: