网络编程技术期末考试复习题及参考答案专升本文档格式.docx
《网络编程技术期末考试复习题及参考答案专升本文档格式.docx》由会员分享,可在线阅读,更多相关《网络编程技术期末考试复习题及参考答案专升本文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
22、套接字编程接口有两种实现方式,第一种是通过在操作系统核心添加相应模块,另一种通过操作系统之外的_______________来实现。
23、当程序使用完WinSock.dll提供的服务后,应用程序必须调用_________________函数,来解除与WinSock.dll库的绑定,释放WinSock实现分配给应用程序的系统资源。
24、监听函数调用listen(s,4),其中参数4的含义是________________________。
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、关于以太网的MAC地址,以下说法错误的是()。
A.是一个6字节长的无符号二进制数。
B.48位全为1的MAC地址被称为广播地址,不能分配给任何计算机。
C.以太网中的每台计算机最多只可以分配一个MAC地址。
D.广播地址在以太网帧中只可以做目的地址,不可以作为源地址。
2、关于端口号,以下说法错误的是()。
A.使用TCP或UDP通信的应用进程都至少需要分配一个端口号。
B.同一台机器上分别使用UDP和TCP通信的两个进程不能分配数值相同的端口号。
C.无论是TCP端口号还是UDP端口号,均是一个16位无符号二进制整数。
D.TCP报文段的目的端口号就是分配给要接收该报文段中的数据的进程的端口号。
3、关于套接字编程接口,下列说法不正确的是()。
A.套接字编程接口是操作系统提供的与网络通信相关的应用程序编程接口。
B.最早的套接字编程接口是Berkeley套接字编程接口。
C.微软的套接字编程接口WinSock是Windows系统核心的一部分。
D.操作系统提供的套接字分为流式套接字、数据报套接字和原始套接字三种。
4、以下叙述错误的是()。
A.in_addr结构中的IP地址是网络字节顺序存储的
B.in_addr结构可以同时存储3种不同方式表示的IPv4地址
C.sockaddr_in结构变量可以保存地址族、端口号和IP地址三种地址信息
D.sockaddr_in结构变量与sockaddr结构变量中存储的内容与顺序完全一致
5、调用bind()函数为服务器端的监听套接字绑定地址时,以下描述错误的是()。
A.IP地址设置为INADDR_ANY,表示该套接字的IP地址由系统自动指定。
B.可将PORT定义为0,这时系统会自动为期分配一个端口号。
C.不绑定地址也不会出现明显错误,当调用listen()时系统会为其自动分配。
D.bind()函数执行成功将返回True,否则返回SOCKET_ERROR。
6、在流式套接字编程中,服务器端每成功调用一次accept()函数,该函数都会返回一个用于同客户端通信的已连接套接字,该已连接套接字()。
A.没有绑定IP地址,端口号与监听套接字相同
B.绑定的IP地址与监听套接字的相同,端口号由系统随机分配
C.绑定的IP地址与端口号均与监听套接字的相同
D.没有绑定IP地址,端口号由系统随机分配
7、要获取一个套接字绑定的IP地址和端口号,需要调用函数()。
A.getsockname()B.getpeername()
C.getsockbyname()D.getpeerbyname()
8、在阻塞模式下调用recv()函数,若等待数据到达过程中对方断开连接,recv()将()。
A.返回0B.继续等待C.返回SOCKET_ERRORD.返回-1
9、在下面的函数声明中,不能作为线程函数的是()。
A.DWORDf1(LPVOIDp);
B.intf2();
C.intf3(intx);
D.DWORDf4(LPVOIDp,intx);
10、使用多线程技术实现TCP并发服务器时,()。
A.主线程创建套接字并启动监听,子线程调用accept()与客户建立连接并完成通信。
B.主线程调用accept()与客户建立连接,并将accept()返回的套接字传递给子线程。
C.主线程使用不同的线程函数,分别为每一个客户创建一个子线程进行通信。
D.传递给多个子线程的已连接套接字是同一个套接字。
11、在ioctlsocket()函数中使用()参数,并将argp参数设置为非0值,可以将Socket设置为非阻塞模式。
A.FIONBIOB.FIONREADC.SIOCATMARKD.FIONONBLOCK
12、如果套接字集合fdread非空,则关于语句select(0,&
fdread,NULL,NULL,NULL);
的叙述正确的是()。
A.如果fdread中的所有套接字均未收到数据,select()将阻塞等待1000ms。
B.如果fdread中的所有套接字均未收到数据,select()将立即返回,返回值为0。
C.如果fdread中有套接字收到数据,select()立即返回,返回值为0。
D.如果fdread中有套接字收到数据,select()立即返回,返回值为有数据到达的套接字个数。
13、下面函数中在无连接程序开发中不会调用的函数是()。
A.sendto()B.socket()C.listen()D.recvfrom()
14、如果将已绑定本地地址的数据报套接字设置为允许发送广播数据,则()。
A.该套接字只能发送广播数据。
B.该套接字可以接收广播数据,但不能收到发给本地地址的单播数据。
C.该套接字即可以发送广播数据,也可以发送单播数据包。
D.该套接字可以发送广播数据,也可以发送单播数据,但不可以接收数据。
15、要将原始套接字sRaw,绑定的网卡设置为混杂模式可使用()。
A.DWORDdwValue=1;
ioctlsocket(sRaw,SIO_RCVALL,&
dwValue);
B.DWORDdwValue=0;
C.DWORDdwValue=1;
setsockopt(sRaw,SIO_RCVALL,&
D.DWORDdwValue=0;
16、计算机网络可以被理解为()。
A.多个计算机执行数据处理的软件模块
B.由自主计算机互联起来的集合体
C.多个处理器通过共享内存实现的紧耦合系统
D.用于共同完成一项任务的分布式系统
17、以下关于路由器的描述错误的是()。
A.路由器是一种分组交换设备
B.路由器实际上是一种具有多个网络接口的专用计算机
C.路由器可实现使用不同传输介质的网络的互联。
D.路由器同网桥一样,都是工作在数据链路层。
18、下列关于UDP协议的叙述中,正确的是()。
Ⅰ提供无连接服务
Ⅱ提供复用/分用服务
Ⅲ通过差错校验,保障可靠数据传输
A.仅ⅠB.仅Ⅰ、ⅡC.仅Ⅱ、ⅢD.Ⅰ、Ⅱ、Ⅲ
19、在C语言中通常使用WinSock2.2实现网络通信功能,这时需要引用头文件()。
A.Winsock2.hB.winsock.hC.winsock22.hD.winsock2.2.h
20、可以将in_addr结构中的IP地址转换为点分十进制字符串方式的函数是()。
A.inet_addr()B.inet_aton()C.inet_ntoa()D.ntohs()
21、下面能实现把端口号从本机字节顺序转换到网络字节顺序的函数是:
()
A.htons()B.htonl()C.ntohl()D.ntohs()
22、下面对bind()函数的功能描述错误的是()。
A.该函数仅适用于流式套接字。
B.该函数用来将套接字绑定到指定的网络地址上。
C.该函数一般在connect()或listen()函数调用前使用。
D.在客户机端使用的套接字一般不必绑定,除非要指定它使用特定的网络地址。
23、客户端发出connect()调用后,若返回WSAETIMEOUT,表示:
A.无可用缓冲区B.参数不正确C.套接口早已连接D.超时时间到
24、在流式套接字编程中,客户端建立连接用的套接字()。
A.必须调用bind()函数绑本地定IP地址和端口号
B.不必调用bind()函数绑定本地IP地址和端口号,系统会自动为其分配
C.不必调用bind()函数绑定本地IP地址和端口号,因为它根本不需要
D.不必调用bind()函数绑定本地IP地址和端口号,它由connect()函数的参数指定
25、下面叙述正确的是()。
A.在同一进程中,一个线程函数只可以创建一个线程。
B.只有当进程中的所有线程都运行完毕,进程才会结束。
C.主线程是程序启动时由系统创建的,而子线程是由主线程或其他子线程创建的。
D.子线程在创建时,父线程会为其分配独立的地址空间。
26、若线程函数原形为DWORDf();
,则以下创建线程语句正确的是()。
A.CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)f,NULL,0,&
trdID);
B.CreateThread(NULL,0,f,NULL,0,&
C.CreateThread(NULL,0,f(),NULL,0,&
D.CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)f(),(LPVOID)5,NULL);
27、要将套接字设置为非阻塞模式,以下最准确叙述为()。
A.能使用setsockopt()函数B.能使用ioctlsocket()函数
C.可使用ioctlsocket()或setsockopt()函数D.以上叙述均正确
28、用于判断某个套接字是否在套接字集合的宏是()。
A.FD_ZEROB.FD_CLRC.FD_ISSETD.FD_SET
29、能够将数据报套接字Sock1设置为允许发送广播数据的代码是()。
A.intyes=1;
intsize=sizeof(int);
setsockopt(Sock1,SOL_SOCKET,SO_BROADCAST,(char*)&
yes,size);
B.BOOLyes=FALSE;
intsize=sizeof(BOOL);
C.BOOLyes=TRUE;
setsockopt(Sock1,IPPROTO_IP,SO_BROADCAST,(char*)&
D.intyes=1;
30、关于原始套接字,以下叙述不正确的是()。
A.可以直接发送或接收IP、ICMP、IGMP等网络层协议的报文。
B.通过原始套接字可以将网卡设置为混杂模式,使程序能接收任何流经网卡的IP分组。
C.基于原始套接字的通信是无连接、不可靠的。
D.可以接收除首部的协议字段不能被识别的IP分组之外的所有IP分组。
三、判断题
1、网络字节顺序采用的是大端存储方式。
2、WSAGetLastError()函数的返回值是调用该函数之前的最近一次调用WinSWock函数出错时错误所对应的错误代码。
3、TCP客户端套接字不能绑定地址。
4、新创建的数据报套接字不需要调用bind()函数绑定本地地址也能接收数据。
5、如果只用于接收数据,则数据报套接字必需绑定本地地址。
6、非阻塞模式下,在套接字还没收到任何数据时调用recv()函数接收数据,recv()函数调用将会失败,这时的函数返回值为WSAEWOULDBLOCK。
7、多线程技术是实现并发服务器的唯一技术。
8、调用select()函数时,它的三个套接字集合指针类型的参数非空时,指针指向的套接字集合中必须至少有一个套接字。
9、Windows系统中,使用原始套接字可以发送任何IP数据包。
10、C/S模式中UDPsocket的服务器端必须调用bind()函数来绑定一个地址,这样客户端才可以和服务器端通信()
11、编写网络程序时,发送端必须先将待发送的多字节数据转换成与具体CPU无关的网络字节顺序再发送。
12、gethostbyname()函数只能根据给定的本机的主机名称查询本机的IP地址,不能通过DNS域名查询因特网上的其他主机的IP地址。
13、bind()函数用于将套接字和某个网络地址绑定。
()
14、如果一个TCP服务器程序可同时保持与多个客户的连接,该程序就被称为并发服务器。
15、getpeername()函数的功能是获取与本地套接字相连的对端套接字的协议地址。
16、如果指定的套接字上没有网络事件发生,select()函数将会一直阻塞,无时间限制。
17、使用数据报套接字发送数据时,如果发送的数据长度超过了网络限定的IP分组的最大长度,数据将不会被发送。
18、用于接收广播数据时,数据报套接字可不必绑定本地地址。
19、在原始套接字上只能使用recvfrom()/sendto()收发数据而不能使用send()/recv()。
20、在非混杂模式下,如果原始套接字已通过调用connect()函数绑定了通信对端的IP地址,则该原始套接字只能接收源地址为该绑定地址的IP分组。
四、简答题
1、什么是并发服务器?
简要写出流式套接字编程中使用多线程技术实现并发服务器的编程步骤。
2、请画出编写广播程序的流程图,并作简要说明。
3、阅读下面的程序,简单叙述该程序完成的主要功能。
#include"
iostream"
winsock2.h"
#definePORT65432//定义端口号常量
#pragmacomment(lib,"
ws2_32.lib"
)
usingnamespacestd;
intmain(intargc,char**argv)
{
SOCKETsock_server,newsock;
structsockaddr_inaddr,client_addr;
charmsgbuffer[1024],charmsg[]="
Connectsucceed.\n"
;
WSADATAwsaData;
WORDwVersionRequested=MAKEWORD(2,2);
if(WSAStartup(wVersionRequested,&
wsaData)!
=0)
{
cout<
<
"
加载winsock.dll失败!
\n"
return0;
}
if((sock_server=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)
创建套接字失败!
错误代码:
WSAGetLastError()<
endl;
WSACleanup();
intaddr_len=sizeof(structsockaddr_in);
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
//允许使用本机的任何IP地址
if(bind(sock_server,(structsockaddr*)&
addr,sizeof(addr))!
=0)
地址绑定失败!
closesocket(sock_server);
if(listen(sock_server,0)!
listen函数调用失败!
else
listenning......\n"
intsize;
if((newsock=accept(sock_server,(structsockaddr*)&
client_addr,
&
addr_len))==INVALID_SOCKET)
accept函数调用失败!
else
size=send(newsock,msg,sizeof(msg),0);
if(size==SOCKET_ERROR)
cout<
发送信息失败!
closesocket(newsock);
closesocket(sock_server);
WSACleanup();
return0;
}
信息发送成功!
if((size=recv(newsock,msgbuffer,sizeof(msgbuffer),0))<
0)
接收信息失败!
elseif(size==0)
对方已关闭连接!
else
收到的信息为:
msgbuffer<
closesocket(newsock);
closesocket(sock_server);
4、什么叫套接字?
WinSock的套接字有哪几种?
各种套接字的主要特点是什么?
5、请画出使用流式套接字编程时服务器端和客户端的基本流程图,并作简要说明。
6、阅读下面的程序,简单叙述该程序完成的主要功能。
#definePORT65432
#pragmacomment(lib,"
intmain()
if(WSAStar