网络编程与分层协议设计

网络编程与分层协议设计

ID:15176484

大小:36.50 KB

页数:20页

时间:2018-08-01

上传者:xinshengwencai
网络编程与分层协议设计_第1页
网络编程与分层协议设计_第2页
网络编程与分层协议设计_第3页
网络编程与分层协议设计_第4页
网络编程与分层协议设计_第5页
资源描述:

《网络编程与分层协议设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

网络编程与分层协议设计篇一:网络编程与分层协议设计部分习题答案第2章Linux下C编程环境习题4信号忽略是指不对该信号做出任何响应,就犹如该信号没有发生过一样,进程不对其做任何处理.信号阻塞是指若在某一时刻该信号发生了,此时内核不会将该信号发送给进程,而是将该信号保存起来,待到该函数解除对该信号的阻塞之后,再发送给该进程进行处理.在信号受到阻塞和进程解除对该信号的阻塞,但信号还未到达进程之间的时间段,进程可以任意改变对该信号的处理.当然如果到该进程结束之时如果还没有解除阻塞的话对则该信号的处理和忽略差不多习题5参见程序2_5.c习题6参见程序2_6.c习题720 参见程序2_7.c和程序2_7_withmutex.c习题8此处第8行和第10行是可以交换的.当将其交换以后,首先执行pthread_cond_signal(&mqlock_ready),此时对于另一个之前因条件不满足的线程thread2_run感知到条件变量的变化,开始获取锁.类似于调用pthread_mutex_lock(&mqlock),而此时线程thread1_run尚未解除锁,因此前一个线程thread2_run因无法获取锁而阻塞.随后线程thread1_run调用thread_mutex_unlock(&mqlock)释放锁.此时线程thread2_run得到锁,继续执行.当然对于其他的程序环境是否能够交换视具体环境而定.总得来说都对,不过都有缺陷(参看《Unix环境高级编程》P697-11.4)。习题9参见程序2_9.c第3章网络编程中常用的典型知识习题2参见程序3_2.c习题4structlen_and_flag{unsignedshortreserved:4,};hlen:4,fin:1,syn:1,rst:1,psh:1,ack:1,urg:1,ece:1,20 cwr:1;习题5可以将链表节点置于宿主的固定位置,例如宿主的首个元素位置,然后通过将指向链表节点的指针强制类型转换为宿主节点的地址。习题6参见程序3_6.c习题7先分析为什么要使用双向链表,而不使用单链表:考虑普通的单链表,如下:structnode{}假定a是某个单链表中的节点(structnodea),而b是刚定义的节点(structnodeb)structnode*next;对于这样的链表,在指定的节点a后插入b很容易:b.next=a.next;a.next=&b;然而在指定的节点a前插入b却很麻烦;structnodehead;设head为头结点structnode*temp;20 temp=&head;while(temp-next!=&a)temp=temp-&(转载于:wWW.xlTkWJ.Com小龙文档网:网络编程与分层协议设计)gt;next;得到a的前一个节点temp-next=&b;b.next=&a;将b插入temp与a之间这就花费了一定的时间来搜索a的前一个节点,而linux要节省这部分时间.因此使用双向链表,这就决定一个节点应该含有两个指针(一个向前,一个向后)然后分析为什么prev要是用二级指针,而不使用一级指针:Linux内核中,除了有通用了双向链表,还有通用的哈希链表。后者定义与前者有些不同。因为通常一个哈希表的表头要占用很大空间,而如果每个表头都用一个双向链表来做的话,就显得太浪费了。只用一个指针可以实现相同的功能,并且可以节省一半的表头存储空间.因此这就决定表头只含有一个指针(向前)哈希链表定义如下:structhlist_head{structhlist_node*first;20 }structhlist_node{structhlist_node*next,**pprev;}由于表头结构体hlist_head与节点结构体hlist_node的定义不一样,将使得我们的pprev指针无法直接指向hlist_head,那我们可以让其指向first。而要指向first则pprev必定为二级指针.习题8参见程序3_8.c习题9为了让notifier_chain_register函数的实参能够向主程序返回该函数的处理后结果,该函数在设计上使用了2级指针。如果使用1级指针则无法通过实参带回改变后的结果。习题10在3.2中的程序可以按8比特进行加运算,这两种运算在逻辑上都是可行的,但是按8bit进行加运算,其加的次数差不多是按16bit的2倍,浪费了时间第4章20 基础套接字习题1参见程序4_1.c习题2参见程序4_2.c习题3参见程序4_3.c习题4参见程序4_4.c习题5参见程序4_5.c习题6fprintf(stdout,Servergotconnectionfrom%sportnumber%u ,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));习题7第二个客户端可以连接到服务器,但是客户端程序将阻塞于read函数,直到第一个客户端请求结束,因为服务器程序为迭代的,而并非并行的,accept函数接收第一个连接请求后,没有fork出子进程来处理客户端请求,因此套接口一直被占用,直到客户端关闭连20 接,服务器才执行close关闭连接,这是服务器端才能接收第二个新的连接。所以,若第二个客户端也发出请求,则必须等到第一个客户端请求处理完成,才能够获得服务器的应答。习题8注释掉程序第65~66行后,3次使用4.2节的客户端访问此服务器后,退出客户端,执行ps-a命令后会出现如下现象;3912pts/000:00:004.3<defunct3926pts/000:00:004.3<defunct4006pts/000:00:004.3<defunct这表明三个子进程仍作为僵死进程存在着。其所占的内存空间和其他资源没有被回收。这是由于注释掉65~66行后,程序将不在捕捉SIGCHLD信号,而内核对此信号的默认动作是忽略。由此可以看出,对并发服务器进行SIGCHLD信号捕捉是必要的,因为我们不愿看到僵死进程的出现。习题9用setfollow-fork-mode20 child进入gdb调试工具后,在160行处设置断点后,如题所述,启动第一个客户端无法立刻得到回答,当启动第二个客户端时,可以看到,发出的请求立刻就得到了服务器的应答。这是由于,fork后,父进程关闭套接口描述符后,又返回到主循环执行,并阻塞于accept函数,等待接收新的连接请求。当第二个客户端发来连接请求后,服务器接收,并fork一个新的子进程来处理客户端的请求。这个子进程不会阻塞于write。因此,第二个客户端可以立刻得到服务器的应答。习题10不启动服务器,而单独执行客户端程序时,会发现客户端程序永远阻塞于它的recvfrom调用。即键入格式化要求后不会收到任何应答。程序也不会退出。该错误由sendto引起,但是sendto本身却成功返回,该ICMP错误直到后来才返回,因此称其为异步错误。要使客户端能够发现该错误而退出,有两个方法。第一个方法是为recvfrom设置一个超时,调用函数alarm就可实现超时的设置。第二个方法是为UDP使用connect函数,使其成为连接的UDP套接口,但是使用connect后的UDP套接口,不能给输出操作指定目的ip和端口号,也就是说,我们不再使用sendto,而改用write或send。写到已连接的UDP套接口上的内容都会自动发送到由connect函数指定的协议地址。同时,我们也不必使用recvfrom函数,而是改用read或recv。此时由内核为输入操作返回的数据报仅仅是那些来自connect所指定的协议地址的数据报。20 因此我们可以将4.5的客户端程序作如下修改。首先注释掉86~91行和107~113行。然后在第85行后添加以下代码if(connect(s,(structsockaddr*)&adr_srvr,len_inet)==-1){printf(connecterror );exit(1);}然后再在114行前添加z=read(s,dgram,sizeofdgram);最后重新编译,运行(仍然不启动服务器)程序就不会永远阻塞于recvfrom调用,而是返回一个“Connectionrefused:recvfrom()”错误后退出。篇二:网络编程设计网络编程设计一、选择题(1小题1分,共30分)1.关于HTML文件说法错误的是:(C)AHTML文件是一个包含标记的文本文件。B这些标记告诉浏览器怎样显示这个页面。CHTML文件必须以.htm为扩展名。DHTML文件可以用一个简单的文本编辑器创建。2、关于HTML文件说法正确的是:(C)AHTML标记都必须配对使用。B在<title和</title标签之间的是头信息。CHTML标签是大小写无关的,<b跟<B表示的意思是一样的。D20 在<u和</u标签之间的文本会以加粗字体显示。3、想要在HTML中显示一个小于号“<”,需要用到字符实体(B)。AB<C&nbsp;D4、HTML使用锚标签(<a)来创建一个连接到其他文件的链接,链接的资源(D)。A只能是HTML页面和图像B不可以是声音C不可以是影片D可以是网络上的任何资源5、锚标签(<a)的target属性,可以定义从什么地方打开链接地址,下列哪一个是target属性的默认值(A)。A_selfB_blankC_parentD_top6.数据库支持是必须的,目前应用领域的数据库系统全部采用(A)。A关系型数据库B网状型数据库C对象型数据库D20 层次型数据库8.以下哪个不是J2EE的13中核心技术(D)AJTABJTSBJAFDJFC9.关于public类,下面说法正确的是(A)AJava程序中最多只能有一个public类BJava程序中必须有public类CJava程序中可以有2个以上public类D以上说法全部错误10、关于锚标签(<a)说法错误的是:(D)A用name属性创建一个命名锚点,可以让链接直接跳转到一个页面的某一章节,而不用用户打开那一页,再从上到下慢慢找。B想要访问本页的锚点,在URL地址的后面加一个“#”和这个锚点的名字。Chref属性用来指定连接到的URL。Dhref属性不能用来指定到一个邮箱地址。11、关于HTML框架说法错误的是:(A)A<frame标签定义了如何将窗口拆分成框架。B可以给不支持框架的浏览器写上<noframes标签。CHTML框架中的各个页面是相互独立的。DHTML框架的使用让打印整个页面变得困难。20 13、关于HTML表格说法错误的是:(C)A表格的width属性可以设置为像素值或百分比。B表格的height属性可以设置为像素值或百分比。C如果不指定border属性,表格默认宽度为1。D表格和单元格的背景色可以同时设置。14、下列哪一种设置能使单元格显示边框(A)A在<td中添加border属性B在<table中添加border属性C在<tr中添加border属性D以上全都可以15、关于网页中的图像,下列说法正确的是(C)A图像是由<img标签开始,由</img结束。B图像标签的href属性用于指定图像链接到的URL。Csrc属性的值是所要显示图像的URL。D以上全都是错的。16、配置IIS时,设置站点的主目录的位置,下面说法正确的是(D)。A只能在本机的c:inetpubwwwroot文件夹。B只能在本机操作系统所在磁盘的文件夹。C只能在本机非操作系统所在磁盘的文件夹。D以上全都是错的。17、VBScript中,下列说法正确的是(B)A没有计算数的指数次方的运算符,但可以通过*20 运算符实现。B&运算符可以强制将任意两个表达式进行字符串链接。C表达式16/5的结果是1。D以上都正确18、VBScript中,下列运算符优先级最高的是(B)A求余运算(Mod)B负数(-)C乘法和除法(*,/)D字符串连接(&)19、如果a=Int(10*Rnd()),则a的值不可能是(D)A0B1C9D1020、如果v=FormatNumber(10.123456,3),则v等于(C)。A10.1B10.12C10.123D20 以上都不对21、下列表达式的值为-10的是(D)AInt(-10.9)B-Abs(-10.9)CFix(-9.9)DInt(-9.9)22、关于日期和时间函数,下列说法正确的是(D)。Anow函数可以返回客户端计算机当前的日期和时间值。B表达式Weekday(Date)将得到表示当前日期是星期几的英文字符,如星期日为“Friday”。CTimer函数返回午夜12时以后已经过去的小时数。D表达式DateAdd(d,10,Date)是表示当前日期的十天后。23、赋值V=”6”并执行a=IsNumeric(V)语句后,a是(D)。A字符串型B日期型C数值型D布尔型24、下列哪一个函数可以将日期转换为字符串?(C)ACdateBCIntCCStrDCDbl25、请问Mid(“Iama20 student.”,9,2)的返回值是什么?(A)A“tu”B“st”C“en”D“nt”26、下列说法正确的是(A)A执行UCase(HelloWorld)后,返回HELLOWORLD。B执行LCase(VBScript)后,返回vbsCRIPT。C执行RTrim(vbscript)后,返回vbscript。D执行Split(VBScriptXisxfun!,x)后,返回包含“VBScriptXis”和“fun”的一维数组。27、下列语句中,不能正常显示的是(B)AResponse.WritetimeBResponse.WritedayCResponse.WritenowDResponse.Writedate28、关于Session对象的属性,下列说法正确的是(C)ASession的有效期时长默认为90秒,且不能修改。BSession的有效期时长默认为20分钟,且不能修改。CSessionI20 D可以存储每个用户Session的代号,是一个不重复的长整型数字。29、QueryString获取方法、Form获取方法获取的数据子类型分别是:(C)A数字、字符串B字符串、数字C字符串、字符串D必须根据具体值而定D以上全都错35、Response对象的属性(D)可以用于表明页输出是否被缓冲。ATotalBytesBContentTypeCstatusDBuffer二、填空题(1小题1分,共10分)1.编译器将处理.java源文件生成类文件,类文件可通过名称为java的加载实用程序解释执行,将Java字节码转换为机器可执行代码。2.3.Java语言包含三种核心机制:Java。4.为实现跨平台性,Java引进的技术是针对不同的平台上,完全由软件模拟或由软件和硬件共同模拟,实现一台虚拟的计算机。5.20 3.0表示一个型常量,占位内存空间。篇三:实验报告-IP分段与重组实验四课程名称:TCP/IP协议栈分析与实现实验项目名称:IP报文分段与重组模拟学生姓名:专业:学号:同组学生姓名:实验地点:实验日期:年月日一、实验目的学习Linux内核IP报文分段和重组的原理,掌握IP报文分段重组模拟程序的关键实现方法。二、实验内容1、联调Forward而和Host程序,观察基于消息分段和重组的文件传输过程。2、完成IP报文分段和重组程序中用户退出登录的功能实现。三、实验要求1、选定4台PC工作站,其中一台作为转发服务器Forwarder,两台作为文件传输的发送方Host,另外一台作为接收方Host。20 2、每3人一组,参考教材《网络编程与分层协议设计—基于Linux平台实现》第9.10一节的说明,完成IP报文分段与重组模拟程序的编译,并将Forwarder和Host正确部署在上述4台工作站上,以实现不同Host之间的文件传输。3、仔细阅读Host.c和Forwarder.c源文件中关于消息分段、再分段和分段重组函数的实现代码。4、完成Host.c中app_do_exit函数的实现,要求当某个已登录Host退出后,其他仍在线用户的的在线用户列表中能去除该退出登录的用户名。四、实现原理1.IP报文分段和重组模拟程序功能描述IP报文分段和重组模拟程序的核心功能是通过UDP编程,完成基于应用层消息分段和重组下的文件传输。整个模拟程序主要由两个独立的角色构成,即Forwarder和Host,如下图所示:其中Forwarder主要作为数据传输的中间转发单元,其主要功能是模拟IP网络中的路由器对IP分组进行再分段处理,此外Forwarder还兼作业务服务器,完成各个用户(Host)的登陆处理。Host的主要作用是作为文件传输的源用户和目标用户,并且可以按照一对一或多对一方式,从源Host向目标Host发起文件传输活动。2.协议分层20 在IP报文分段和重组模拟程序中,工作于Forwarder和Host中的分层协议分为三层,一是业务逻辑层,负责应用的业务处理,如登陆Forwarder和文件传输;二是分段重组层,其功能是根据当前程序设定的UDP消息长度阈值的大小,对来自上层的业务逻辑消息进行必要的分段后,将消息分段交给消息发送与接收层进行发送,或者将从网络上收到的消息分段进行重组后,再交给业务逻辑层进行业务处理。协议分层如下所示:HostAHostCForwarderostBHostD源HostForwarder目的Host3.协议设计请仔细阅读教材《网络编程与分层协议设计—基于Linux平台实现》第6.5.3一节的内容,准确掌握IP报文分段与重组模拟程序的分层协议定义。五、实验任务1、实现退出登录业务功能请完成某个登录用户退出的功能实现,要求所有其他在线用户通过刷新用户登录列表,可以看到该退出登录用户已经下线。2、程序运行截图相关热词搜索:分层网络编程协议设计网络编程基础知识应用层协议有哪些qt网络编程类20 20

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭