1、网络编程技术期末考试复习题及参考答案专升本网络编程技术复习题一、填空题1、计算机网络上传输的数据都是以分组(packet)为单位的,分组实际就是一个由二进制字节构成的序列,它包括_和控制信息两部分。2、路由表中缺省路由的掩码为_。3、一台计算机如果只向网络中的某一台计算机发送数据称为单播,如果要同时向网络中的所有计算机发送信息,则被称为_。4、用来描述如何实现网络体系结构中各层次功能的具体方法和步骤的是_。5、如果调用函数gethostbyname()失败,返回一个_ 。6、网络应用进程间的通信普遍采用C/S交互模式,在该模式中,通信双方中发起通信的一方被称为_。7、套接字编程接口有两种实现方
2、式,第一种是通过通过在操作系统核心添加相应模块,另一种通过操作系统之外的函数库来实现。Windows Socket就是以_方式实现的。8、Windows Socket套接字包括流式套接字 (SOCK_STREAM)、_以及原始套接字(SOCKET_RAW)三种类型。9、在使用C语言编程时,通常使用WinSock2.2实现网络通信的功能,则需要引用库文件_。10、函数socket(AF_INET,SOCK_STREAM,0);的功能是_。11、要将一个套接字设置为非阻塞模式应使用的套接字函数是(只写函数名)_。12、监听函数调用listen(s,3),其中参数3的含义是_。13、在select(
3、)函数中使用_结构体来管理多个Socket。14、IP广播地址分为两种:_和有限广播地址。15、自定义IP分组是指IP首部各字段值均由应用程序填写的IP分组。要使一个原始套接字能够发送自定义IP分组,该套接字的IP_HDRINCL选项值应设置为_。16、_规定了网络的层次结构以及各层应具有的功能,但对各层功能的实现方法不做具体规定。17、物理线路连同实现链路通信协议的硬件和软件一起被称为_。18、以太网的数据帧中,目的地址通常是_的MAC地址。19、从以太网交换机的工作原理可知,网中的任何一台计算机发送一个广播信息,网中所有的计算机都能收到,因此称能收该广播帧的这些计算机在同一个_中。20、W
4、insock函数getservebyname()的功能是根据给定的服务名称和该服务所使用的_获取端口号等信息。21、套接字编程接口源于美国加州大学伯克利分校开发推广的一个包括TCP/IP协议的操作系统BSD UNIX,它是该操作系统提供给其用户的网络应用程序_。22、套接字编程接口有两种实现方式,第一种是通过在操作系统核心添加相应模块,另一种通过操作系统之外的_来实现。23、当程序使用完WinSock.dll提供的服务后,应用程序必须调用_函数,来解除与WinSock.dll库的绑定,释放WinSock实现分配给应用程序的系统资源。24、监听函数调用listen(s,4),其中参数4的含义是_
5、。25、socket套接字的三种类型:流式套接字 (SOCK_STREAM)、数据报套接字(SOCK_DGRAM) 及_。26、套接字有阻塞和非阻塞两种工作模式,在_模式下,I/O操作完成前执行操作的函数会一直等候而不立即返回。27、WinSock的套接字I/O模型中的Select模型是因为该模型使用函数_实现而得名的。28、socket(AF_INET,SOCK_DGRAM,0);该函数的功能是_。29、用于获取Socket选项的函数是(只写函数名)_。30、要使一个原始套接字能够发送自定义IP分组,在创建该套接字时,socket()函数的第三个参数(协议类型)的值应使用_。二、选择题1、关
6、于以太网的MAC地址,以下说法错误的是( )。A是一个6字节长的无符号二进制数。B48位全为1的MAC地址被称为广播地址,不能分配给任何计算机。C以太网中的每台计算机最多只可以分配一个MAC地址。D广播地址在以太网帧中只可以做目的地址,不可以作为源地址。2、关于端口号,以下说法错误的是( )。A使用TCP或UDP通信的应用进程都至少需要分配一个端口号。B同一台机器上分别使用UDP和TCP通信的两个进程不能分配数值相同的端口号。C无论是TCP端口号还是UDP端口号,均是一个16位无符号二进制整数。DTCP报文段的目的端口号就是分配给要接收该报文段中的数据的进程的端口号。3、关于套接字编程接口,下
7、列说法不正确的是( )。A套接字编程接口是操作系统提供的与网络通信相关的应用程序编程接口。B最早的套接字编程接口是Berkeley套接字编程接口。C微软的套接字编程接口WinSock是Windows系统核心的一部分。D操作系统提供的套接字分为流式套接字、数据报套接字和原始套接字三种。4、以下叙述错误的是( )。Ain_addr结构中的IP地址是网络字节顺序存储的Bin_addr结构可以同时存储3种不同方式表示的IPv4地址Csockaddr_in结构变量可以保存地址族、端口号和IP地址三种地址信息Dsockaddr_in结构变量与sockaddr结构变量中存储的内容与顺序完全一致5、调用bin
8、d()函数为服务器端的监听套接字绑定地址时,以下描述错误的是( )。A. IP地址设置为INADDR_ANY,表示该套接字的IP地址由系统自动指定。B. 可将PORT定义为0,这时系统会自动为期分配一个端口号。C. 不绑定地址也不会出现明显错误,当调用listen()时系统会为其自动分配。D. bind()函数执行成功将返回True,否则返回SOCKET_ERROR。6、在流式套接字编程中,服务器端每成功调用一次accept()函数,该函数都会返回一个用于同客户端通信的已连接套接字,该已连接套接字( )。A. 没有绑定IP地址,端口号与监听套接字相同B. 绑定的IP地址与监听套接字的相同,端口
9、号由系统随机分配C. 绑定的IP地址与端口号均与监听套接字的相同D. 没有绑定IP地址,端口号由系统随机分配7、要获取一个套接字绑定的IP地址和端口号,需要调用函数( )。A. getsockname() B. getpeername() C. getsockbyname() D. getpeerbyname() 8、在阻塞模式下调用recv()函数,若等待数据到达过程中对方断开连接,recv()将( )。A. 返回0 B. 继续等待 C. 返回SOCKET_ERROR D. 返回-19、在下面的函数声明中,不能作为线程函数的是( )。ADWORD f1( LPVOID p); Bint f2
10、(); Cint f3(int x); DDWORD f4( LPVOID p, int x); 10、使用多线程技术实现TCP并发服务器时,( )。A主线程创建套接字并启动监听,子线程调用accept()与客户建立连接并完成通信。B主线程调用accept()与客户建立连接,并将accept()返回的套接字传递给子线程。 C主线程使用不同的线程函数,分别为每一个客户创建一个子线程进行通信。D传递给多个子线程的已连接套接字是同一个套接字。 11、在ioctlsocket()函数中使用( )参数,并将argp参数设置为非0值,可以将Socket设置为非阻塞模式。AFIONBIO BFIONREAD
11、 CSIOCATMARK DFIONONBLOCK12、如果套接字集合fdread非空,则关于语句select(0, &fdread, NULL, NULL, NULL);的叙述正确的是( )。A如果fdread中的所有套接字均未收到数据,select()将阻塞等待1000ms。B如果fdread中的所有套接字均未收到数据,select()将立即返回,返回值为0。C如果fdread中有套接字收到数据,select()立即返回,返回值为0。D如果fdread中有套接字收到数据,select()立即返回,返回值为有数据到达的套接字个数。13、下面函数中在无连接程序开发中不会调用的函数是( )。A.
12、 sendto() B. socket() C. listen() D. recvfrom()14、如果将已绑定本地地址的数据报套接字设置为允许发送广播数据,则( )。A. 该套接字只能发送广播数据。B. 该套接字可以接收广播数据,但不能收到发给本地地址的单播数据。C. 该套接字即可以发送广播数据,也可以发送单播数据包。D. 该套接字可以发送广播数据,也可以发送单播数据,但不可以接收数据。15、要将原始套接字sRaw,绑定的网卡设置为混杂模式可使用( )。A. DWORD dwValue = 1; ioctlsocket(sRaw, SIO_RCVALL, &dwValue);B. DWORD
13、 dwValue = 0; ioctlsocket(sRaw, SIO_RCVALL, &dwValue);C. DWORD dwValue = 1; setsockopt (sRaw, SIO_RCVALL, &dwValue);D. DWORD dwValue = 0; setsockopt (sRaw, SIO_RCVALL, &dwValue);16、计算机网络可以被理解为( )。 A多个计算机执行数据处理的软件模块 B由自主计算机互联起来的集合体C多个处理器通过共享内存实现的紧耦合系统 D用于共同完成一项任务的分布式系统17、以下关于路由器的描述错误的是( )。 A路由器是一种分组交
14、换设备B路由器实际上是一种具有多个网络接口的专用计算机C路由器可实现使用不同传输介质的网络的互联。D路由器同网桥一样,都是工作在数据链路层。18、下列关于UDP协议的叙述中,正确的是( )。 提供无连接服务 提供复用/分用服务 通过差错校验,保障可靠数据传输A仅 B. 仅、 C. 仅、 D. 、19、在C语言中通常使用WinSock2.2实现网络通信功能,这时需要引用头文件( )。AWinsock2.h Bwinsock.h Cwinsock22.h Dwinsock2.2.h20、可以将in_addr结构中的IP地址转换为点分十进制字符串方式的函数是( )。Ainet_addr() Bine
15、t_aton() C.inet_ntoa() Dntohs()21、下面能实现把端口号从本机字节顺序转换到网络字节顺序的函数是:( )A. htons( ) B. htonl( ) C. ntohl( ) D. ntohs( )22、下面对bind()函数的功能描述错误的是( )。A. 该函数仅适用于流式套接字。B. 该函数用来将套接字绑定到指定的网络地址上。C. 该函数一般在connect()或listen()函数调用前使用。D. 在客户机端使用的套接字一般不必绑定,除非要指定它使用特定的网络地址。23、客户端发出connect( )调用后,若返回WSAETIMEOUT,表示:( )A. 无
16、可用缓冲区 B. 参数不正确 C. 套接口早已连接 D. 超时时间到24、在流式套接字编程中,客户端建立连接用的套接字( )。A. 必须调用bind()函数绑本地定IP地址和端口号 B. 不必调用bind()函数绑定本地IP地址和端口号,系统会自动为其分配C. 不必调用bind()函数绑定本地IP地址和端口号,因为它根本不需要D. 不必调用bind()函数绑定本地IP地址和端口号,它由connect()函数的参数指定25、下面叙述正确的是( )。A在同一进程中,一个线程函数只可以创建一个线程。B只有当进程中的所有线程都运行完毕,进程才会结束。 C主线程是程序启动时由系统创建的,而子线程是由主线
17、程或其他子线程创建的。D子线程在创建时,父线程会为其分配独立的地址空间。26、若线程函数原形为 DWORD f();,则以下创建线程语句正确的是( )。ACreateThread(NULL,0, (LPTHREAD_START_ROUTINE)f, NULL, 0, &trdID);BCreateThread(NULL, 0, f, NULL , 0, &trdID);CCreateThread(NULL, 0, f(), NULL , 0, &trdID);DCreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)f(), (LPVOID) 5 ,NULL
18、);27、要将套接字设置为非阻塞模式,以下最准确叙述为( )。A能使用setsockopt()函数 B能使用ioctlsocket()函数C可使用ioctlsocket()或setsockopt()函数 D以上叙述均正确28、用于判断某个套接字是否在套接字集合的宏是( )。AFD_ZERO BFD_CLR CFD_ISSET DFD_SET29、能够将数据报套接字Sock1设置为允许发送广播数据的代码是( )。A. int yes=1; int size= sizeof(int); setsockopt(Sock1,SOL_SOCKET,SO_BROADCAST,(char*)&yes,siz
19、e);B. BOOL yes=FALSE; int size= sizeof(BOOL); setsockopt(Sock1,SOL_SOCKET,SO_BROADCAST,(char*)&yes,size);C. BOOL yes=TRUE; int size= sizeof(BOOL); setsockopt(Sock1,IPPROTO_IP,SO_BROADCAST,(char*)&yes,size);D. int yes=1; int size= sizeof(int); setsockopt(Sock1,IPPROTO_IP,SO_BROADCAST,(char*)&yes,size
20、);30、关于原始套接字,以下叙述不正确的是( )。A. 可以直接发送或接收IP、ICMP、IGMP等网络层协议的报文。B. 通过原始套接字可以将网卡设置为混杂模式,使程序能接收任何流经网卡的IP分组。C. 基于原始套接字的通信是无连接、不可靠的。D. 可以接收除首部的协议字段不能被识别的IP分组之外的所有IP分组。三、判断题1、网络字节顺序采用的是大端存储方式。( )2、WSAGetLastError()函数的返回值是调用该函数之前的最近一次调用WinSWock函数出错时错误所对应的错误代码。( )3、TCP客户端套接字不能绑定地址。( )4、新创建的数据报套接字不需要调用bind()函数绑
21、定本地地址也能接收数据。( )5、 如果只用于接收数据,则数据报套接字必需绑定本地地址。( )6、非阻塞模式下,在套接字还没收到任何数据时调用recv()函数接收数据,recv()函数调用将会失败,这时的函数返回值为WSAEWOULDBLOCK。( )7、多线程技术是实现并发服务器的唯一技术。( )8、调用select()函数时,它的三个套接字集合指针类型的参数非空时,指针指向的套接字集合中必须至少有一个套接字。( )9、Windows系统中,使用原始套接字可以发送任何IP数据包。( )10、C/S模式中UDP socket的服务器端必须调用bind()函数来绑定一个地址,这样客户端才可以和服
22、务器端通信 ( )11、编写网络程序时,发送端必须先将待发送的多字节数据转换成与具体CPU无关的网络字节顺序再发送。( )12、gethostbyname() 函数只能根据给定的本机的主机名称查询本机的IP地址,不能通过DNS域名查询因特网上的其他主机的IP地址。( )13、bind()函数用于将套接字和某个网络地址绑定。 ( ) 14、如果一个TCP服务器程序可同时保持与多个客户的连接,该程序就被称为并发服务器。( )15、getpeername()函数的功能是获取与本地套接字相连的对端套接字的协议地址。( )16、如果指定的套接字上没有网络事件发生,select()函数将会一直阻塞,无时间
23、限制。( )17、使用数据报套接字发送数据时,如果发送的数据长度超过了网络限定的IP分组的最大长度,数据将不会被发送。( )18、用于接收广播数据时,数据报套接字可不必绑定本地地址。( )19、在原始套接字上只能使用recvfrom()/sendto()收发数据而不能使用send()/recv()。( )20、在非混杂模式下,如果原始套接字已通过调用connect()函数绑定了通信对端的IP地址,则该原始套接字只能接收源地址为该绑定地址的IP分组。( )四、简答题1、什么是并发服务器?简要写出流式套接字编程中使用多线程技术实现并发服务器的编程步骤。2、请画出编写广播程序的流程图,并作简要说明。
24、3、阅读下面的程序,简单叙述该程序完成的主要功能。#include iostream#include winsock2.h#define PORT 65432 /定义端口号常量#pragma comment(lib, ws2_32.lib)using namespace std;int main(int argc, char *argv) SOCKET sock_server,newsock; struct sockaddr_in addr,client_addr; char msgbuffer1024,char msg =Connect succeed. n; WSADATA wsaData
25、; WORD wVersionRequested=MAKEWORD(2,2); if(WSAStartup(wVersionRequested,&wsaData)!=0) cout加载winsock.dll失败!n; return 0; if (sock_server = socket(AF_INET,SOCK_STREAM,0) = SOCKET_ERROR) cout创建套接字失败!错误代码:WSAGetLastError()endl; WSACleanup(); return 0; int addr_len = sizeof(struct sockaddr_in); addr.sin_f
26、amily =AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY);/允许使用本机的任何IP地址 if(bind(sock_server,( struct sockaddr *)&addr,sizeof(addr)!=0) cout地址绑定失败!错误代码:WSAGetLastError()endl; closesocket(sock_server); WSACleanup(); return 0; if(listen(sock_server,0)!=0) coutlisten函数调用失败!错
27、误代码:WSAGetLastError()endl; closesocket(sock_server); WSACleanup(); return 0; else coutlistenning.n; int size; if(newsock = accept (sock_server, (struct sockaddr *)&client_addr, &addr_len) =INVALID_SOCKET) coutaccept函数调用失败!错误代码:WSAGetLastError()endl;else size=send(newsock,msg,sizeof(msg),0); if(size=
28、 SOCKET_ERROR) cout发送信息失败!错误代码:WSAGetLastError()endl; closesocket(newsock); closesocket(sock_server); WSACleanup(); return 0;else cout信息发送成功!n; if(size=recv(newsock,msgbuffer,sizeof(msgbuffer),0)0) cout接收信息失败!错误代码:WSAGetLastError()endl; else if(size=0) cout对方已关闭连接!n; else cout收到的信息为:msgbufferendl;cl
29、osesocket(newsock); closesocket(sock_server); WSACleanup(); return 0;4、什么叫套接字?WinSock的套接字有哪几种?各种套接字的主要特点是什么?5、请画出使用流式套接字编程时服务器端和客户端的基本流程图,并作简要说明。6、阅读下面的程序,简单叙述该程序完成的主要功能。#include iostream#include winsock2.h#define PORT 65432#pragma comment(lib,ws2_32.lib)using namespace std;int main() WSADATA wsaData; WORD wVersionRequested=MAKEWORD(2,2); if(WSAStar
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1