收藏 分销(赏)

Window网络与通信程序设计试题.ppt

上传人:pc****0 文档编号:13182623 上传时间:2026-01-31 格式:PPT 页数:26 大小:1,010.50KB 下载积分:10 金币
下载 相关 举报
Window网络与通信程序设计试题.ppt_第1页
第1页 / 共26页
Window网络与通信程序设计试题.ppt_第2页
第2页 / 共26页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,作业,1,1,、使用,API,函数描述基于,TCP,的服务器和客户端程序的基本流程。,Server:WSAStartup()socket()bind(),listen()accept(),recv()/send()closesocket(),WSACleanup(),Client:WSAStartup()socket(),connect()send()/recv(),closesocket()WSACleanup(),2026/1/31 周六,1,2,、调用,connect,()时触发什么过程?,UDP,编程时可 否调用,connect,(),为什么?,A:,触发三次握手过程。,UDP,编程时可以调用,connect(),因为在数据报套接字上调用,connect(),不会触发三次握手过程,操作系统仅仅将连接地址保存后直接返回,后续调用,sendto(),时可以不填入目标地址。,2026/1/31 周六,2,3,、,UDP,通信时需要将收到的信息回送给对方该怎么处理?给出实现代码。,char recvbuf256;,int recvbytes,,,sendbytes;,sockaddr_in addr;,int len=sizeof(addr);,recvbytes=recvfrom(s,recvbuf,256,0,(sockaddr*),sendbytes=sendto(s,recvbuf,strlen(recvbuf),0,(sockaddr*),/,判断返回值,2026/1/31 周六,3,4,、调用,recvfrom,()之前是否必须显式绑定?为什么?,A:,不一定需要显式绑定。如果在调用,recvfrom(),之前调用了,sendto(),则可以不显式绑定。,2026/1/31 周六,4,5,、,4,个数据收发函数可否都在,TCP,和,UDP,通信中使用?请比较使用时注意事项。,A,:都可以。,(,1,),sendto(),和,recvfrom(),在,UDP,通信中以及,send(),和,recv(),在,TCP,通信中按照常规使用方式。,(,2,),send(),在,UDP,通信中需先调用,connect();recv,(),在,UDP,通信中需先调用,bind(),。,(,3,),sendto(),和,recvfrom(),在,TCP,通信中,只需将后,两个参数设为,0,即可。,2026/1/31 周六,5,作业,2,从以下方面比较,WSAAsyncSelect,模型和,WSAEventSelect,模型的异同。,1,、能处理的网络事件类型,2,、得到网络事件通知的途径,3,、单线程能处理的套接字个数,4,、判断网络事件类型和网络错误方法,5,、触发,FD_READ,和,FD_WRITE,的条件(具体说明),2026/1/31 周六,6,1,、能处理的网络事件类型,相同,常用网络事件包括,FD_ACCEPT,、,FD_READ,、,FD_WRITE,、,FD_CLOSE,等,2,、得到网络事件通知的途径,不同。,WSAAsyncSelect,模型由操作系统捕获网络事件并封装成,WINDWOS,消息,发送到窗口程序的消息队列中,应用程序从其消息队列中取出消息从而获得网络事件通知;而,WSAEventSelect,模型是通过等待关联的事件状态变化来获取事件通知。,3,、单线程能处理的套接字个数,不同,,WSAEventSelect,模型为,64,,,WSAAsyncSelect,模型没有限制。,2026/1/31 周六,7,4,、判断网络事件类型和网络错误方法,不同。,WSAEventSelect,模型通过调用,WSAEnumNetworkEvents(),函数传入的指向,WSANETWORKEVENTS,结构体的指针,lpNetworkEvents,来返回网络网络事件和错误代码。,if(lpNetworkEvents-lNetworkEvents&FD_*),,则表示发生了对应的网络事件;,if(lpNetworkEvents-iErrorCodeFD_*_BIT!=0),表示发生了网络错误。,2026/1/31 周六,8,WSAAsyncSelect,模型通过,MSG,的附加信息来判断网络事件和网络错误。,wParam,指定发生网络事件的套接字句柄,LParam,指定发生的网络事件和错误代码。,其中高字位指出网络错误。采用宏:,if(WSAGETSELECTERROR(,lParam,),表示发生网络错误,低字位指出发生的网络事件,采用宏:,if(WSAGETSELECTEVENT(lParam)=FD_*),表示发生对应的网络事件。,2026/1/31 周六,9,5,、触发,FD_READ,和,FD_WRITE,的条件(具体说明),收到,FD_READ,事件通知的情况:,(,1,)调用,WSAAsyncSelect(),对,socket,注册 FD_R,EAD,事件时,,接收缓冲区中,已有,数据,。,(,2,),接收缓冲区由空变为有数据,(3)调用 recv,(),或,recvfro,m(),从接收缓冲区读,取,数据时,没有,读完。,2026/1/31 周六,10,收到,FD_WRITE,事件通知的情况:,使用,connect,或,WSAConnect,,一个套接字首次建立了连接。,(,针对客户端,),使用,accept,或,WSAAccept,,套接字被接受以后。,若,send,、,WSASend,、,sendto,或,WSASendTo,操作失败,返回了,WSAEWOULDBLOCK,错误,而且缓冲区的空间变得可用。,2026/1/31 周六,11,作业,3,Q:,在,TCP,服务器编程时,可以对每个,accept,()返回的套接字创建线程来处理该套接字上的数据收发,这样做有什么缺点?第三章的,IO,模型中哪些模型能改善这一缺点?为什么?,A:,缺点:线程膨胀。造成空间开销、时间开销增加,影响服务器性能。,(10,分,),所有,IO,模型均可以改善这一缺点。,Select,模型:通过设置套接字集合,可以在一个集合中管理,64,(,default,)个套接字。通过自定义,FD_SETSIZE,管理更多的套接字。(,10,分),WSAAsyncSelect,模型:采用消息机制,调用,WSAAsyncSelect,()将套接字和窗口句柄关联起来,理论上可以管理的套接字数目没有限制,只是服务器性能会下降。(,10,分),2026/1/31 周六,12,WSAEventSelect,模型:将每个套接字和一个事件对象关联,该模型最多等待,64,个套接字,也就是最多处理,64,套接字。连接套接字增加时可以使用线程池技术。(,10,分),重叠,IO,模型:使用重叠结构投递,IO,请求后,重叠结构中事件对象受信后查询重叠操作结果,处理数据。采用单线程可以管理多个套接字,将套接字和套接字使用的,IO,缓冲区以对象的形式组织成链表,通过套接字来创建其对应的缓冲区对象(包含一个重叠结构)。(,10,分),2026/1/31 周六,13,Q:,完成端口中,per-handle,数据和,per-IO,数据各有什么作用?,A:,客户上下文对象(单句柄数据):主要作用在于关联完成端口时传递套接字信息,在查询完成端口时该套接字信息会通过,lpCompletionKey,参数返回。(,15,分),缓冲区对象(单,IO,数据):主要作用在于投递重叠,IO,时传递,IO,信息,包括缓冲区,,IO,类型、,OVERLAPPED,结构等等。在查询完成端口时通过,lpOverlapped,参数返回投递,IO,时使用的重叠结构地址,通过该该结构获得投递,IO,时使用单,IO,数据。(,15,分),通过二者可以确定已完成,IO,的套接字以及该套接字上的,IO,信息,进而处理数据。,用程序流程图描述使用完成端口的编程步骤(,20,分),(),2026/1/31 周六,15,作业,4,Q:,实现广播和多播时能否使用流式套接字?为什么?,A:,单播时只能使用流式套接字,实现广播和多播时只能使用数据报套接字。流式套接字一旦建立后,其通信的端点就固定不变,通信只能在两个端点之间进行,而广播和多播通信是一对多的通信,显然流式套接字不能满足要求,而数据报套接字为无连接的,指定发送的目的地址即可。(,10,分),Q,:在,winsock1,和,winsock2,中如何加入和退出多播组?,A,:,winsock1,使用,setsockopt(),函数加入和退出多播组,加入,:(,5,分),struct ip_mreq mcast,;,/,对,mcast,赋值,setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mcast,sizeof(mcast),;,退出,:(,5,分),setsockopt(sockM,IPPROTO_IP,IP_DROP_MEMBERSHIP,,,(char*)&mcast,sizeof(mcast),;,2026/1/31 周六,17,winsock2,使用,WSAJoinLeaf(),函数加入多播组,退出多播组直接关闭由,WSAJoinLeaf,返回的套接字,socket sock,sockM;struct sockaddr_in mcast,;,/mcast,赋值,加入,:(,5,分),sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED),;,sockM=WSAJoinLeaf(sock,(SOCKADDR*)&mcast,sizeof(mcast),NULL,NULL,NULL,NULL,JL_BOTH,);,退出,:(,5,分),closesocket(sockM);,2026/1/31 周六,18,Q,:某主机,IP,为,202.3.4.5,使用排除方式加入多播组,234.5.6.7,同时拒绝接受来自,222.1.2.3,的数据,.,请给出实现代码(仅加入多播组和排除源地址的代码即可),A:,struct ip_mreq mcast;,struct ip_mreq_source mresrc;,加入多播组,:(,10,分),mcast.imr_multiaddr.S_un.S_addr=inet_addr(,234.5.6.7,),;,mcast.imr_interface.S_un.S_addr=inet_addr(,202.3.4.5,),;,setsockopt(sockM,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char*)&mcast,sizeof(mcast),;,2026/1/31 周六,19,排除源地址,:(10,分,),mresrc.imr_interface.S_un.S_addr=inet_addr(,“,202.3.4.5,),;,mresrc.imr_multiaddr.S_un.S_addr=inet_addr(,234.5.6.7,),;,mresrc.imr_sourceaddr.S_un.S_addr=inet_addr(,222.1.2.3,);,setsockopt(sockM,IPPROTO_IP,IP_BLOCK_SOURCE,(char*)&mresrc,sizeof(mresrc),2026/1/31 周六,20,4,、发送自己封装的,UDP,数据报应遵循什么步骤?(,20,分),(,1,)首先以,IPPOTO_UDP,为协议类型创建一个原始套接字,打开原始套接字上的,IP_HDRINCL,选项;,(,2,)然后构建,UDP,封包(先设置,IP,头,再设置,UDP,头,最后设置数据);,(,3,)初始化完整的,UDP,封包之后,调用,sendto,函数即可将它发送。,2026/1/31 周六,21,Q,:阐述路由跟踪原理,给出实现思路。,A,:,基本思想:多次发送数据包,,TTL,递增,,TTL,为,0,时返回一条,ICMP,报文。(,10,分),两种方法:发,UDP,数据报和,ICMP,数据包。,(,1,)使用,UDP,时创建两个套接字,:(,5,分),sRaw,用于接收,ICMP,数据包,sSend,用于发送,TTL,不断增加的,UDP,数据报,(,2,)使用,ICMP,数据包时使用一个原始套接字(,5,分),Q,:简述网络嗅探器的编写步骤。(,10,分),A:,1,、创建原始套接字并,绑定到明确的本地地址,,不能使用,INADDR_ANY,。,2,、调用,ioctlsocket(),设置混杂模式,3,、调用,recv(),函数获取数据包。,4,、解析收到的数据包。,补充习题,1,、套接字工作在阻塞模式下,列举,5,个会阻塞的,Winsock API,函数。,2,、列举,ioctlsocket(),函数两种用途。,3,、,TCP,编程时客户端程序是否需要调用,bind(),函数?为什么?,4,、重叠操作使用的重叠结构上的事件对象状态由无信号状态变为有信号状态,是否意味着这一次重叠操作成功完成?为什么?,5,、解决套接字工作在非阻塞模式下的,WSAEWOULDBLOCK,错误需要解决什么根本问题?如何有效解决?,2026/1/31 周六,24,1,、,Q:,套接字工作在阻塞模式下,列举,5,个会阻塞的,Winsock API,函数。,A:accept(),send(),recv(),sendto(),recvform(),注意在非阻塞模式下这些函数不会阻塞。,2,、,Q:,列举,ioctlsocket(),函数两种用途。,A:1,、设置套接字的工作模式,2,、获取套接字上可读取的数据量,3,、,Q:TCP,编程时客户端程序是否需要调用,bind(),函数?为什么?,A:,不需要,调用,connect(),函数时会隐式绑定。,2026/1/31 周六,25,4,、,Q:,重叠操作使用的重叠结构上的事件对象状态由无信号状态变为有信号状态,是否意味着这一次重叠操作成功完成?为什么?,A:,不一定。事件对象状态由无信号状态变为有信号状态仅仅意味着这次操作完成。完成有两个成功和失败两种可能,因此编程时查询重叠操作结果后对返回值进行判断处理。,5,、,Q:,解决套接字工作在非阻塞模式下的,WSAEWOULDBLOCK,错误需要解决什么根本问题?如何有效解决?,A,:解决套接字上何时可以读写数据。使用,IO,模型。,2026/1/31 周六,26,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服