2014大学Windows网络程序设计期末复习试卷模拟习题5

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

12014大学Windows网络程序设计期末复习试卷模拟习题51tcp和udp连接的区别,分别适用于哪些应用场合?tcp协议和udp协议的差别TCPUDP是否连接面向连接面向非连接传输可靠性可靠不可靠应用场合传输大量数据少量数据速度慢快2tcp连接建立的过程(三次握手)TCP双方都可以发送数据给对方,所以它是全双工的协议TCP建立连接的过程通常被称为三次握手1)SYN_SENT(synsent)发起方发送一个设置了SYN标志的TCP数据包和初始化序列号(InitialSequenceNumber,ISN)以及端口号给接收方,这常被叫做SYN数据包或SYN报文连接的状态被称做SYN_SENT2)SYN_RCVD(synrecieved)接收方收到请求,给发起方发送一个设置了SYN与ACK标志位的TCP数据包做为应答,另外设置一个比客户机发送来的ISN大1个单位的ISN值,这常被称为SYN_ACK数据包或SYN_ACK报文这时连接的状态称做SYN_RCVD3)ESTABLISHED发起方然后发送一个带有ACK应答和增1后的ISN标志来确认SYN_ACK至此,完成了三次握手,此时的连接状态为连结成功:ESTABLISHED3sockaddr与sockaddr_in的区别,为什么要用两个数据结构?如何赋值?sockaddr包括sockaddr_in和sockaddr_un等,前者用于inet(网络)后者用于unix文件。sockaddr是winsockAPI中参数的基本形式,sockaddr_in是其IP地址结构。sockaddr是通用的套接字地址,而sockaddr_in则是internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。4建立tcp连接客户端和服务端的过程。为什么服务端要调用bind函数而客户端不用?为什么服务端需要指定端口而客户端不用?建立2基于udp的收发程序的过程服务端则需用bind函数连接和接收数据报因为服务程序必须调用bind函数来给其绑定一个IP地址和一个特定的端口号,而客户端不用。服务端需要通过指定端口来接收客户的请求连接。5简述IP协议的特点TCP/IP协议的特点①TCP/IP协议并不依赖于特定的网络传输硬件,所以TCPIIP协议能够集成各种各样的网络。用户能够使用以太网(Ethernet)、令牌环网(TokenRingNetwork)、拨号线路(Dial-upline)、X.25网以及所有的网络传输硬件。②TCP/IP协议不依赖于任何特定的计算机硬件或操作系统,提供开放的协议标准,即使不考虑Internet,TCP/IP协议也获得了广泛的支持。所以TCP/IP协议成为一种联合各中硬件和软件的实用系统。③TCP/IP工作站和网络使用统一的全球范围寻址系统,在世界范围内给每个TCP/IP网络指定唯一的地址。这样就使得无论用户的物理地址在哪儿,任何其他用户都能访问该用户。6广播组播通信与点对点通信的区别广播主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要)。组播主机之间“一对一组”的通讯模式,也就是加入了同一个组的主机可以接受到此组内的所有数据,网络中的交换机和路由器只向有需求者复制并转发其所需数据。主机可以向路由器请求加入或退出某个组,网络中的路由器和交换机有选择的复制并传输数据,即只将组内数据传输给那些加入组的主机。点对点主机之间“一对一”的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制。至于区别嘛,从MAC地址上来分,MAC地址是6个字节的,如果全是1就是广播,如果第一个字节是01就是组播啦,其它的就是单播。7阻塞与非阻塞通信的区别以套接字为例,在阻塞模式下,利用TCP协议发送一个报文时,如果低层协议没有可用空间来存放用户数据,则应用进程将阻塞等待直到协议有可用的空间。而在非阻塞模式下,调用将直接返回而不需等待。在应用进程调用接收函数接收报文时,如果是在阻塞模式下,若没有到达的数据,则调用将一直阻塞直到有数据到达或出错;而在非阻塞模式下,将直接返回而不需等待。对于UDP协议而言,由于UDP没有发送缓存,因此所有UDP协议即使在阻塞模式下也不会发生阻塞。对于面向连接的协议,在连接建立阶段,阻塞与非阻塞也表现不一。在阻塞模式下,如果没有连接请求到达,则等待连接调用将阻塞直到有连接请求到达;但在非阻塞模式下,如果没有连接请求到达,等待连接调用将直接返回。8select函数工作机制分析select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组,每一个数组元素都能与一打开的文件句柄(不管是Socket句柄,还是其他文件或3命名管道或设备句柄)建立联系,建立联系的工作由程序员完成,当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执行了select()的进程哪一Socket或文件可读9使用事件通知模型实现异步传输的过程描述(自己的语言),WSAEventSelect函数的作用说明WSAAsyncSelect使用此模型,应用程序可在一个套接字上进行以windows消息为基础的网络事件通知,此模型提供了读写数据能力的异步通知,但不提供异步数据传送。异步数据传送有“重叠及完成端口模型提供”。过程:(1)初始化套接字相关信息:(2)开始启动一个事件通知。WSAAsyncSelect(Sock,hWnd,自定义消息,网络事件)(3)响应窗口的自定义消息处理函数,其中lparam的高位字包含了可能出现的错误代码,低字节表示发生的网络事件。wParam表示发生网络事件的套接字。10WSAAsyncSelect函数和windows消息机制的结合过程,一般来说,监听套接字需要处理哪些网络事件?会话套接字需要处理哪些网络事件?11windows消息处理过程窗口消息处理程序与窗口类别相关,窗口类别是程序呼叫RegisterClass注册的。依据该类别建立的窗口使用这个窗口消息处理程序来处理窗口的所有消息。Windows通过呼叫窗口消息处理程序对窗口发送消息。在第一次建立窗口时,Windows呼叫WndProc。在窗口关闭时,Windows也呼叫WndProc。窗口改变大小、移动或者变成图示时,从菜单中选择某一项目、挪动滚动条、按下鼠标按钮或者从键盘输入字符时,以及窗口显示区域必须被更新时,Windows都要呼叫WndProc。12Windows消息处理函数的四个参数分别是什么?携带了什么信4息?1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。13windows的线程函数使用什么作为参数?如果要从主线程(通常为界面线程)传递数据给工作线程,应如何传递?如果要从工作线程传递数据给主线程(界面线程有窗口),应如何传递?线程的创建和终止WindowsAPI提供了CreateThread()函数来创建一个线程。其原型如下所示:HANDLECreateThread(LPSECURITY_ATTRIBUTESsecAttr,SIZE_TstackSize,LPTHREAD_START_ROUTINEthreadFunc,LPVOIDparam,DWORDflags,LPDWORDthreadID);在此,secAttr是一个用来描述线程的安全属性的指针。如果secAttr是NULL,就会使用默认的安全描述符。每个线程都具有自己的堆栈。可以使用stackSize参数来按字节指定新线程堆栈的大小。如果这个整数值为0,那么这个线程堆栈的大小与创建它的线程相同。如果需要的话,这个堆栈可以扩展。(通常使用0来指定线程堆栈的大小)。每个线程都在创建它的进程中通过调用线程函数来开始执行。线程的执行一直持续到线程函数返回。这个函数的地址(也就是线程的入口点)在threadFunc中指定。每个线程函数都必须具有这样的原型:5DWORDWINAPIthreadfunc(LPVOIDparam);需要传递给新线程的任何参数都在CreateThread()的param中指定。线程函数在它的参数中接收这个32位的值。这个参数可以用作任何目的。函数返回它的退出状态。参数flags确定了线程的执行状态。如果它是0,线程会立即执行。如果是CREATE_SUSPEND,线程则以挂起状态创建并等待执行。(可以通过调用ResumeThread()来开始执行,稍后讨论)。与线程相关的标识符以threadID所指向的长整型返回。如果成功,函数则向线程返回一个句柄。如果失败,则返回NULL。可以通过调用CloseHandle()来显式销毁这个线程。否则,会在父进程结束时自动销毁它。如前所述,当线程的入口函数返回时终止执行线程。进程也可以使用TerminateThread()或者ExitThread()来手动终止线程,这两个函数的原型如下:BOOLTerminateThread(HANDLEthread,DWORDstatus);VOIDExitThread(DWORDstatus);对于TerminateThread(),thread是将要终止的线程的句柄。ExitThread()只能用来终止调用了ExitThread()的线程。对于两个函数而言,status是终止状态。TerminateThread()如果成功,则会返回非0值,否则返回0。调用ExitThread()在功能上等价于允许线程函数正常返回。这意味着堆栈会正确地重新设置。当使用TerminateThread()结束线程时,线程会立刻终止,而会执行任何特定的清理任务。另外,TerminateThread()可能会停止正在执行重要操作的线程。为此,当入口函数返回时,通常最好(也是最容易的)让线程正常终止。14windows的MSG结构包括哪些内容?在Windows程序中,消息是由MSG结构体来表示的。MSG结构体的定义如下(参见MSDN):typedefstructtagMSG{HWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;6DWORDtime;POINTpt;}MSG;该结构体中各成员变量的含义如下:一个消息一般都是与某个窗口相关联的。例如,在某个活动窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。在Windows程序中,用HWND类型的变量来标识窗口。第二个成员变量message指定了消息的标识符。在Windows中,消息是由一个数值来表示的,不同的消息对应不同的数值。但是由于数值不便于记忆,所以Windows将消息对应的数值定义为WM_XXX宏(WM是WindowMessage的缩写)的形式,XXX对应某种消息的英文拼写的大写形式。例如,鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR,等等。在程序中我们通常都是以WM_XXX宏的形式来使用消息的。提示:如果想知道WM_XXX消息对应的具体数值,可以在VisualC++开发环境中

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功