当前位置:文档之家› 网络程序设计习题题目练习

网络程序设计习题题目练习

1.TCP/UDP在传输层;IP在网络层;MAC在数据链路层2.NAT的实现方式有三种,即静态转换、动态转换和端口多路复用3.端口号是16位的,范围在0~655354.在套接字通信中,常用套接字类型包括三类:流式套接字、数据报套接字和原始套接字①流式套接字(其类型字段的值是SOCK_STREAM): 提供面向连接的、可靠的字节流服务,应用程序所访问的传输层协议是TCP协议。

②数据报式套接字(其类型字段的值是SOCK_DGRAM): 提供无连接的,不可靠的数据报服务,应用程序所访问的传输层协议是UDP协议。

③原始套接字(其类型字段的值是SOCK_RAW): 允许应用程序直接对较低层的协议,如IP、ICMP进行访问。

5.有状态服务器定义:保存状态信息的服务器优势:减少客户和服务器交换报文的大小;允许服务器快速相应请求无状态服务器定义:不保存任何状态信息的服务器优势:提高协议的可靠性6.并发服务器定义:在一个时刻只处理一个请求的服务器循环服务器定义:在一个时刻可以处理多个请求的服务器7.面向应用的网络编程方法(1)WinInet编程(2)基于WWW应用的网络编程(3)面向SOA的Web Service8.面向原始帧的网络编程方法(1)直接网卡编程技术(2)基于Packet Driver的网络编程方法(3)基于NDIS的网络编程(4)WinPcap编程9.UDP是无连接的;TCP是面向连接的意义:①决定了客户和服务器交互所采用的算法;②决定了下层系统所提供的可靠性等级;面向连接的服务器优点:易于编程缺点:资源消耗问题无连接的服务器优点:无资源消耗问题缺点:编程复杂10.bind和listen函数是非阻塞的11.B/S模型B/S(Browse/Server)模型也叫B/S模式,它是一种基于Web的通信模型,使用HTTP通信。

B/S是一种特殊的C/S模型,特殊之处就在于这种模型的客户端一般是某种流行的浏览器,例如,微软的Internet Explorer。

优点:单台计算机可以访问任何一个Web服务器,不需要针对不同的服务器分别提供专用的客户端软件。

12.客户/服务器模型优点:(1)结构简单(2)支持分布式、并发环境(3)服务器集中管理资源,有利于权限控制和系统安全(4)可扩展性好缺点:(1)缺乏有效的安全性(2)客户负荷过重(3)服务器工作效率低(4)容易造成网络阻塞13.浏览器/服务器模型优点:(1)具有分布性特点,可以随时随地进行查询、浏览等业务处理(2)业务扩展简单方便,通过增加网页即可增加服务器功能(3)维护简单方便(4)开发简单,共享性强缺点:(1)操作时以鼠标为最基本的操作方式,无法满足快速操作的要求(2)页面动态刷新,响应速度明显降低(3)功能弱化,难以实现传统模式下的特殊功能要求14.字节顺序:大端顺序和小端顺序15.Linux中提供的基本I/O功能16.会聚点问题的解决方案1)要求下层通信协议在请求报文到达后自动创建运行程序——底层通讯程序太复杂!2)要求在任何一对进行通信的应用进程中,有一方必须在启动执行后(无限期)等待对方与其联系。

——客户-服务器模型的解决方案17.客户端通信过程:①socket初始化;②创建套接字,指定使用TCP(可靠的传输服务)进行通信;③指定服务器地址和通信端口;④向服务器发送连接请求;⑤进行数据传输;⑥关闭套接字;⑦结束对windows sockets dll的使用。

18.服务器通信过程:①socket初始化;②创建套接字,指定使用TCP(可靠的传输服务)进行通信;③指定本地地址和通信端口;④等待客户端的连接请求;⑤进行数据传输;⑥关闭套接字;⑦结束对windows sockets dll的使用。

19.接收函数的调用结果有很多种完整接收流数据int iResult, recvbuflen;char recvbuf [MSGSZ];do {iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);if ( iResult > 0 )printf("Bytes received: %d\n", iResult);else {if ( iResult == 0 )printf("Connection closed\n");elseprintf("recv failed with error: %d\n", WSAGetLastError());}} while( iResult > 0 );20.接收定长数据int recvn(SOCKET s, char * recvbuf, unsigned int fixedlen){int iResult; //存储单次recv操作的返回值int cnt; //用于统计相对于固定长度,剩余多少字节尚未接收cnt = fixedlen;while ( cnt > 0 ) {iResult = recv(s, recvbuf, cnt, 0);if ( iResult < 0 ){//数据接收出现错误,返回失败printf("接收发生错误: %d\n", WSAGetLastError());return -1;}if ( iResult == 0 ){//对方关闭连接,返回已接收到的小于fixedlen的字节数printf("连接关闭\n");return fixedlen - cnt;}//printf("接收到的字节数: %d\n", iResult);//接收缓存指针向后移动recvbuf +=iResult;//更新cnt值cnt -=iResult;}return fixedlen;}21.接收变长数据int recvvl(SOCKET s, char * recvbuf, unsigned int recvbuflen){int iResult;//存储单次recv操作的返回值unsigned int reclen; //用于存储报文头部存储的长度信息 //获取接收报文长度信息iResult = recvn(s, ( char * )&reclen, sizeof( unsigned int ));if ( iResult !=sizeof ( unsigned int ){//如果长度字段在接收时没有返回一个整型数据就返回(连接关闭)或-1(发生错误)if ( iResult == -1 ){printf("接收发生错误: %d\n", WSAGetLastError());return -1;}else{printf("连接关闭\n");return 0;}}//转换网络字节顺序到主机字节顺序reclen = ntohl( reclen );if ( reclen > recvbuflen ){//如果recvbuf没有足够的空间存储变长消息,则接收该消息并丢弃,返回错误while ( reclen > 0){iResult = recvn( s, recvbuf, recvbuflen );if ( iResult != recvbuflen ){//如果变长消息在接收时没有返回足够的数据就返回(连接关闭)或-1(发生错误)if ( iResult == -1 ){printf("收发生错误:%d\n", WSAGetLastError());return -1;}else {printf("连接关闭\n");return 0;}}reclen -= recvbuflen;//处理最后一段数据长度if ( reclen < recvbuflen )recvbuflen = reclen;}printf("可变长度的消息超出预分配的接收缓存\r\n");return -1;}//接收可变长消息iResult = recvn( s, recvbuf, reclen );if ( iResult != reclen ){//如果消息在接收时没有返回足够的数据就返回(连接关闭)或-1(发生错误)if ( iResult == -1 ) {printf("接收发生错误: %d\n", WSAGetLastError());return -1;}else {printf("连接关闭\n");return 0;}}return iResult;}简答题2、阐述程序、套接字、端口和协议之间的关系程序和套接字的关系:一个程序可以同时使用多个套接字,不同套接字完成不同的传输任务。

多个应用程序可以同时使用同一个套接字,不过这种情况并不常见。

套接字和端口的关系:每个套接字都有一个关联的本地TCP或UDP端口,它用于把传入的分组指引到应该接收它们的应用程序。

一个端口上可能关联多个套接字,流式套接字的服务器上可能同时有监听套接字和连接套接字,它们都与一个TCP的端口号相关联;一个套接字一般只会关联一个唯一的本地端口号。

端口和协议的关系:TCP和UDP的端口号是独立使用的。

3、在基于流式套接字的网络应用程序设计中,假设客户端以8字节-12字节-8字节-12字节的顺序交替发送数据给服务器,请思考,服务器的接收操作每次能够接收到多少字节的数据?为什么?服务器接收操作每次能够接收到的数据长度是不确定的,这是因为TCP传送数据的形态是没有间隔的字节流,数据接收仅与接收调用的时间和当前主机内核缓存中尚未提交应用程序的数据有关,与发送端发送多少次和TCP如何传送没有直接的关系,我们不能准确地预测一个特定的接收操作到底返回多少字节。

4.在服务器和客户的通信过程中,服务器是如何处理多个客户服务请求的呢?1)如果是循环服务器,则服务器在与一个客户建立连接后,其他客户只能等待;当一个客户服务完之后,服务器才会接收另一个客户的服务请求;即循环服务器的通信流程中,蓝色的3个步骤是循环进行的;2)如果是并发服务器,则当服务器与一个客户进行通信的过程中,可以同时接收其他客户的服务请求,并且服务器要为每一个客户创建一个从进程,在从进程中用新创建的套接字与客户交互;即并发服务器的通信流程中蓝色的3个步骤,在与多个客户通信时,是并发执行的;5.为什么客户端没有bind,而服务器端需要?客户端是主动连接,而服务器是等待连接,因此服务器必须需要绑定IP地址和端口号,而客户端不需要。

相关主题