安徽理工大学2017网络编程试卷及卷参考答案_第1页
安徽理工大学2017网络编程试卷及卷参考答案_第2页
安徽理工大学2017网络编程试卷及卷参考答案_第3页
安徽理工大学2017网络编程试卷及卷参考答案_第4页
安徽理工大学2017网络编程试卷及卷参考答案_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

20 16 20 17学年 第 2 学期 试 卷 课程名称:网络编程 考试形式:闭卷 试卷:A 专业班级: 计算机14-14 专业班级: 学号: 姓名: 该项由出卷人填写装 订 线一、 名词解释(写出要点即可)(3*5=15分)1、套接口2、主机字节序3、地址族4、网络掩码5、管道二、 简答(5*7=35分)1、简述套接口与已打开的文件之间的差异。2、socket中的缓冲有哪几种基本模式?3、常用的套接口类型有哪几种?4、SOCK_DGRAM套接口具有哪些特征?5、简述close和shutdown在关闭套接口时的不同。6、简述传统的本地地址和抽象的本地地址之间的区别?7、简述在SOCK_STREAM和SOCK_DGRAM套接口调用connect函数的异同。三、 程序阅读及填空(20分)1、下面的程序为基于UDP的服务器端,该服务器用户接收从客户端输入的服务名或端口号,查询/etc/services文件,然后将查询结果,返回给客户端,设编译后,命令名为getserv,完成其空白部分。int main(int argc, char *argv)struct sockaddr_in addr_inet,addr_clnt;int z,len_inet,s,res;char recbuf512,dtfmt512;/接收缓冲区和发送缓冲区char *caddr=NULL,*cport=NULL;/服务器地址和端口if (argc=2)/命令行格式为:getserv SrvIP:SrvPort ; ;else/缺省地址caddr=127.0.0.23;cport=9090;/*创建套接口*/ ;if (s=-1)bail(socket();/*建立地址*/memset(&addr_inet,0,sizeof addr_inet); addr_inet.sin_family=AF_INET; ; /短整型主机字节序转换成网络字节序 ; /处理网络地址if (addr_inet.sin_addr.s_addr=INADDR_NONE)bail(bad address.);len_inet=sizeof addr_inet;/*服务器端绑定地址*/ ;if (z=-1) bail(bind();/*等待客户端请求*/for (; ; )/*服务器端一直阻塞,指导在指定的套接口上接收到数据报*/len_inet=sizeof addr_clnt; ;if (z0) bail(recvfrom(2);/*客户端请求处理*/recbufz=0;if (!strcasecmp(recbuf,QUIT) break;/*客户端请求处理*/memset(dtfmt,0,sizeof dtfmt);res=lookfor(dtfmt,recbuf);/获得处理结果if (!res) sprintf(dtfmt,error!);/*返回格式化结构,并发送到客户端*/ ;if (z0)pid=waitpid(-1,&stat,WNOHANG);/signal(SIGCHLD,sig_handler);return;int main(int argc, char *argv)int clt_addr_len,listen_fd,com_fd,ret,i,len,port;char recv_bufMAX_BUF,snd_bufMAX_BUF;pid_t pid;struct sockaddr_in clt_addr,srv_addr;int z, reuseaddr,opt_len,srcfd,dst_file;if (argc!=2)printf(Usage: %s portn,argv0);return 1;/获得输入的端口号port=atoi(argv1);if (signal(SIGCHLD,sig_handler)0) /return 1;/reuseaddr=TRUE;opt_len=sizeof reuseaddr;z=setsockopt(s,SOL_SOCKET,SO_REUSEADDR,&reuseaddr,opt_len);if (z)bail(setsockopt(SO_REUSEADDR);listen_fd=socket(PF_INET,SOCK_STREAM,0);if (listen_fd0)return 1;/memset(&srv_addr,0,sizeof srv_addr);srv_addr.sin_family=AF_INET;srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);srv_addr.sin_port=htons(port);/ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof srv_addr);if (ret=-1)close(listen_fd);return 1;/监听指定端口,连接5个客户端ret=listen(listen_fd,5);if (ret=-1)perror(cannot listen to the client connect request);return 1;/* 对每个连接进来的客户端创建一个进程,单独与服务器进行通信* 首先调用read函数读取客户端发送来的信息,将其转换成大写后* 发送回客户端,当输入时,程序退出*/while (TRUE)len=sizeof clt_addr;com_fd=accept(listen_fd,(struct sockaddr *)&clt_addr,&len);if (com_fd0)if (errno=EINTR)/系统调用的执行由于捕获中断而终止continue;elseperror(cannot accept client connect request);close(listen_fd);return 1;pid=fork();if (pid0)perror(cannot create the child process);close(listen_fd);return 1;else if (pid=0)/子进程srcfd=rdfname(com_fd,(void *)recv_buf,MAX_BUF);/处理文件名z=trnsfile(srcfd,com_fd,(void *)recv_buf,MAX_BUF);/传输文件close(com_fd);exit(0);elseclose(com_fd);return 0;第 ( 1 ) 页 共 ( 14 ) 页 20 16 20 17学年 第 2 学期 试 卷 课程名称:网络编程 考试形式:闭卷 试卷:C 专业班级: 专业班级: 学号: 姓名: 该项由出卷人填写装 订 线 专业班级: 专业班级: 学号: 姓名: 该项由出卷人填写装 订 线/ret=listen(listen_fd,5);if (ret=-1)return 1;while (TRUE)len=sizeof clt_addr;com_fd=accept(listen_fd,(struct sockaddr *)&clt_addr,&len);if (com_fd0)if (errno=EINTR)/continue;elseclose(listen_fd);return 1;pid=fork();if (pid0)/close(listen_fd);return 1;else if (pid=0) /srcfd=rdfname(com_fd,(void *)recv_buf,MAX_BUF);/处理文件名z=trnsfile(srcfd,com_fd,(void *)recv_buf,MAX_BUF);/传输文件close(com_fd);exit(0);else/close(com_fd);return 0;四、 编程(15*2=30分)1、 编程实现从给定的IP地址中取出网络标识,并以点分十进制输出IP地址和 网络标识。2、 设计一段程序,作为服务器端,本机地址192.193.194.195,端口2000,监听队列长5,采用字节流模式,INET地址模式 ;实现服务器功能。 专业班级: 计算机14-14 专业班级: 学号: 姓名: 该项由出卷人填写装 订 线五、 名词解释(写出要点即可)(3*5=15分)1、套接口2、主机字节序3、地址族4、网络掩码5、管道六、 简答(5*7=35分)1、简述套接口与已打开的文件之间的差异。2、socket中的缓冲有哪几种基本模式?3、常用的套接口类型有哪几种?4、SOCK_DGRAM套接口具有哪些特征?5、简述close和shutdown在关闭套接口时的不同。6、简述传统的本地地址和抽象的本地地址之间的区别?7、简述在SOCK_STREAM和SOCK_DGRAM套接口调用connect函数的异同。七、 分析程序(20分)1、extern int h_errno; /int main(int argc,char *argv) /int x ,x2;struct hostent *hp;/for(x=1;xh_name);/ fputs( Aliases:t ,stdout); / for(x2=0;hp-h_aliasesx2;+x2)/ if(x2) fputs(,stdout); fputs(hp-h_aliasesx2,stdout);fputc(n,stdout);printf( Type:tt%sn,hp-h_addrtype=AF_INET?AF_INET:AF_INET6);if(hp-h_addrtype=AF_INET)for(x2=0;hp-h_addr_listx2;+x2) printf( Address:t%sn,inet_ntoa(*(struct in_addr *)hp-h_addr_listx2);putchar(n);return 0;2、int main(int argc,char *argv)int z;char *srvr_addr=NULL;struct sockaddr_in adr_inet;/struct sockaddr_in adr_clnt;int len_inet;int s;char dgram512;char dtfmt512;time_t td;struct tm tm;if(argc=2) /srvr_addr=argv1;elsesrvr_addr=127.0.0.13;s=socket(PF_INET,SOCK_DGRAM,0);if(s=-1)printf(socket();memset(&adr_inet,0,sizeof adr_inet); /adr_inet.sin_family=AF_INET; /adr_inet.sin_port=htons(9000); /adr_inet.sin_addr.s_addr=inet_addr(srvr_addr); /if(adr_inet.sin_addr.s_addr=INADDR_NONE) / printf(bad address.);len_inet=sizeof adr_inet;z=bind(s,(struct sockaddr *)&adr_inet,len_inet);if(z=-1)printf(bind();for(;)len_inet=sizeof adr_clnt;z=recvfrom(s,dgram,sizeof dgram,0,(struct sockaddr *)&adr_clnt,&len_inet); /if(z0)printf(recvfrom(2);dgramz=0;if(!strcasecmp(dgram,QUIT) /break;time(&td);tm=*localtime(&td);strftime(dtfmt,sizeof dtfmt,dgram,&tm);z=sendto(s,dtfmt,strlen(dtfmt),0,(struct sockaddr *)&adr_clnt,len_inet); /if(z0)printf(sendto(2);close(s);return 0;八、 编程(15*2=30分)1、 编程实现从给定的IP地址中取出网络标识,并以点分十进制输出IP地址和 网络标识。2、 设计一段程序,作为服务器端,本机地址192.193.194.195,端口2000,监听队列长5,采用字节流模式,INET地址模式 ;实现服务器功能。第 ( 14 ) 页 共 ( 14 ) 页 专业班级: 计算机14-14 专业班级: 学号: 姓名: 该项由出卷人填写 装 订 线20162017学年第二学期网络编程A卷参考答案一 名词解释(写出要点即可)(3*5=15分)1.套接口:套接口是一个为了用户应用进程可以方便进行通信的接口系统。在该系统中最大限度的使用了已有的系统调用,同时也添加新的系统调用来支持TCP/IP功能。套接口代表通信线路中的端点。2.主机字节序:CPU使用的字节序,根据不同的实现,操作系统根据自身的设计可以选择使用大端字节序或小端字节序。3.地址族:用于指明在套接口中使用哪一种地址类型,通常在实现中,一种套接口协议只使用一种种类的地址,故地址族也可以直接对应协议族,且可以在调用中混用。但在地址初始化时,不能使用地址族代替协议族,反之亦然。4.网络掩码:作用在于把网路地址从IP地址中提取出来,即网络掩码与IP地址进行按位与,可以获得网络号。5.管道:是连接一个程序的输出和另一个程序的输入的单向通信通道。二 简答(5*7=35分)1. 简述套接口与已打开的文件之间的差异。答:不能在套接口上调用lseek,但在已打开的文件上可以调用lseek以指定文件指针的位置;套接口可以和网络地址绑定,而文件和管道不能;套接口具有很多能通过ioctl进行查询和设置的选项;套接口必须在正确的状态下才能实现输入和输出,而已打开的文件在任何时候都可以进行读或写操作。2. socket中的缓冲有哪几种基本模式?答:socket缓冲区有三种基本类型:无缓冲,线性缓冲和块缓冲。通常套接口交互式文本行方式时,宜采用线性缓冲,此时无需用户显式调用fflush函数回写套接口;而块缓冲,也叫全缓冲,在进行套接口写操作时,需要显式调用fflush函数回写套接口。3. 常用套接口类型有哪几种?答:套接口常有以下类型:SOCK_STREAM表示使用TCP协议,进行数据流通信,SOCK_DGRAM表示使用UDP协议,SOCK_SEQPACKET表示使用X.25协议,SOCK_RAW表示使用原始的套接口。4. SOCK_DGRAM套接口具有哪些特征?答:SOCK_DGRAM为UDP数据报套接口,其具有如下特征:实现简单、高效、快速,不需要建立连接,故无需连接的建立和拆除,避免了在网络中大量传递用于维护通信的消息分组,从而节省了消息传递的时间;通信更富有弹性,可以为每次消息的发送指定不同的接受者;具有广播能力;UDP协议本身不对消息的有效性进行验证,因此是通信过程是不可靠的;多数据报的无序性;消息尺寸是有限制的。5.简述close和shutdown在关闭套接口时的不同。答:shutdown调用不关心套接口上关联的文件描述符的个数,只是立即关闭套接口,因此shutdown调用将影响该套接口上关联的所有文件描述符,也直接影响所有连接到该套接口上的流;close调用只是将当前套接口上关联的文件描述符个数减一,只当某套接口在调用close后,其关联的文件描述符个数刚好为0,才真正关闭。6.传统的本地地址和抽象的本地地址之间的区别是什么?答:在使用传统的本地套接口地址时,系统会生成一个本地文件对象。而使用抽象地址时不会有这样的文件对象生成。在使用是抽象地址在定义是需要在字符地址前留出一个占位符。7.简述在SOCK_STREAM和SOCK_DGRAM套接口调用connect函数的异同。答:在SOCK_STREAM套接口程序的客户端调用connect函数时,客户端将请求服务器端建立一个固定的连接,此后所有通信的消息都是在该连接上发送和接收的;而SOCK_DGRAM套接口调用connect函数时,并不是希望与服务器端建立连接,只是表明在过后的一段时间内,服务器和客户端的通信将基于当前connect调用时的IP地址,且套接口可以随时取消connect调用。三 程序阅读及填空1. (每空1分,共10分)caddr=strtok(argv1,:);cport=strtok(NULL,0);s=socket(AF_INET,SOCK_DGRAM,0);addr_inet.sin_port=htons(atoi(cport);addr_inet.sin_addr.s_addr=inet_addr(caddr);z=bind(s,(struct sockaddr *)&addr_inet,len_inet);z=recvfrom(s,recbuf,sizeof recbuf,0,(struct sockaddr *)&addr_clnt,&len_inet);z=sendto(s,dtfmt,strlen(dtfmt),0,(struct sockaddr *)&addr_clnt,len_inet);close(s);2.(每空1分,共10分)调用waitpid等待子进程结束,返回结束的子进程的进程号设置信号处理函数,当子进程结束时,有sig_handler函数处理设置套接口选项,激活地址复用套接口地址初始化调用bind函数,绑定套接口地址监听指定端口,将内核的监听队列长度设置为5当accept调用因捕获中断而终止时,重新响应连接请求调用fork函数克隆子进程处理客户端请求,若调用失败关闭监听套接口,返回1子进程处理客户端请求父进程处理。四 编程题1. (15分)/头文件略int main(int argc,char *argv)int x ;struct sockaddr_in adr_inet;const char *addr=192.193.194.195; unsigned long net;memset(&adr_inet,0,sizeof adr_inet);adr_inet.sin_family=AF_INET;adr_inet.sin_port=htons(2000);if(!inet_aton(addr,&adr_inet.sin_addr) puts(bad address);net=inet_netof(adr_inet.sin_addr);printf(%14s: ,inet_ntoa(adr_inet.sin_addr);memset(&adr_inet,0,sizeof adr_inet);adr_inet.sin_family=AF_INET;adr_inet.sin_port=htons(9000);adr_inet.sin_addr=inet_makeaddr(net,0);printf(%14s: ,inet_ntoa(adr_inet.sin_addr);return 0;2.(15分)/头文件略int main(int argc,char* argv)int server_sockfd,client_sockfd;int server_len,client_len;char readbuf80;char writebuf80;char tmp64;struct sockaddr_in server_address;struct sockaddr_in client_address;server_sockfd = socket(AF_INET,SOCK_STREAM,0);memset(&server_address,0,sizeof(server_address);server_address.sun_family = AF_INETadr_inet.sin_port=htons(2000);adr_inet.sin_addr.s_addr=inet_addr(“192.193.194.195”);if(adr_inet.sin_addr.s_addr=INADDR_NONE) printf(bad address.);len_inet=sizeof adr_inet;z=bind(s,(struct sockaddr *)&adr_inet,len_inet);listen(server_sockfd,5);while(1)memset(&readbuf,0,sizeof(readbuf);memset(&writebuf,0,sizeof(writebuf);printf(server waiting.n);client_sockfd = accept(server_sockfd,(struct sockaddr*)&client_address,&client_len);read(client_sockfd,&readbuf,sizeof(readbuf);printf(Client input char %s.n,readbuf);strcpy(&writebuf,Receive OK!);write(client_sockfd,&writebuf,sizeof(writebuf);close(client_sockfd);2016-2017(第2学期)网络编程试卷C参考答案一、名词解释(3*5=15分)1、套接口:套接口是一个为了用户应用进程可以方便进行通信的接口系统。在该系统中最大限度的使用了已有的系统调用,同时也添加新的系统调用来支持TCP/IP功能。套接口代表通信线路中的端点。2、网络字节序:是大端字节序,即一种将高序字节存储在起始位置的方法。3、地址族:用于指明在套接口中使用哪一种地址类型。4、网络掩码:作用在于把网路地址从IP地址中提取出来,即网络掩码与IP地址进行按位与,可以获得网络号。5、管道:是连接一个程序的输出和另一个程序的输入的单向通道。二、简答(5*7=35分)1、简述套接口与已打开的文件之间的差异。答:不能在套接口上调用lseek,但在已打开的文件上可以调用lseek以指定文件指针的位置;套接口可以和网络地址绑定,而文件和管道不能;套接口具有很多能通过ioctl进行查询和设置的选项;套接口必须在正确的状态下才能实现输入和输出,而已打开的文件在任何时候都可以进行读或写操作。2、socket中的缓冲有哪几种基本模式?答:socket缓冲区有三种基本类型:无缓冲,线性缓冲和块缓冲。通常套接口交互式文本行方式时,宜采用线性缓冲,此时无需用户显式调用fflush函数回写套接口;而块缓冲,也叫全缓冲,在进行套接口写操作时,需要显式调用fflush函数回写套接口。3、socket有哪几种常用类型,各是什么?答:套接口常有以下类型:SOCK_STREAM表示使用TCP协议,进行数据流通信,SOCK_DGRAM表示使用UDP协议,SOCK_SEQPACKET表示使用X.25协议,SOCK_RAW表示使用原始的套接口。4、SOCK_DGRAM套接口具有哪些特征?答:SOCK_DGRAM为UDP数据报套接口,其具有如下特征:实现简单、高效、快速,不需要建立连接,故无需连接的建立和拆除,避免了在网络中大量传递用于维护通信的消息分组,从而节省了消息传递的时间;通信更富有弹性,可以为每次消息的发送指定不同的接受者;具有广播能力;UDP协议本身不对消息的有效性进行验证,因此是通信过程是不可靠的;多数据报的无序性;消息尺寸是有限制的。5.简述close和shutdown在关闭套接口时的不同。5、简述close和shutdown在关闭套接口时的不同?答:shutdown调用不关心套接口上关联的文件描述符的个数,只是立即关闭套接口,因此shutdown调用将影响该套接口上关联的所有文件描述符,也直接影响所有连接到该套接口上的流;close调用只是将当前套接口上关联的文件描述符个数减一,只当某套接口在调用close后,其关联的文件描述符个数刚好为0,才真正关闭。6、传统的本地地址和抽象的本地地址之间的区别是什么?答:在使用传统的本地套接口地址时,系统会生成一个本地文件对象。而使用抽象地址时不会有这样的文件对象生成。在使用是抽象地址在定义是需要在字符地址前留出一个占位符。7、简述在SOCK_STREAM和SOCK_DGRAM套接口调用connect函数的异同。答:在SOCK_STREAM套接口程序的客户端调用connect函数时,客户端将请求服务器端建立一个固定的连接,此后所有通信的消息都是在该连接上发送和接收的;而SOCK_DGRAM套接口调用connect函数时,并不是希望与服务器端建立连接,只是表明在过后的一段时间内,服务器和客户端的通信将基于当前connect调用时的IP地址,且套接口可以随时取消connect调用。三、分析程序(20分)1、 说明错误号变量h_errno是一个外部变量该函数演示了如何使用DNS服务来通过主机名获得IP地址定义一个hostent结构指针变量hp用于接收函数gethostbyname的返回根据命令行参数的个数来决定循环的次数通过命令行的主机名参数来获得IP地址如果函数gethostbyname调用失败,继续循环的下一轮。打印命令行参数中的主机名打印gethostname调用返回的主机名输出字符串“Aliases:”以一个制表位结尾打印出该主机的所有别名2、定义服务器端的套接口地址结构命令行参数2用于接收用户输入的服务器地址清空套接口地址结构的所有字节设置套接口的地址族设置该套接口使用的端口号将字符IP地址转换成网络字节序的二进制地址测试inet_addr调用是否失败接收UPD客户端的通信请求如果客户端输入“QUIT”,服务器退出发送服务器端对客户端请求的处理结果给客户端四、编程(15*2=30分)1、编程实现从给定的IP地址中取出网络标识,并以点分十进制输出IP地址和网络标识。#include #include #include #include #include #include #include int main(int argc,char *argv)int x;struct sockaddr_in adr_inet;const char *addr=44.135.86.12; unsigned long net;memset(&adr_inet,0,sizeof adr_inet);adr_inet.sin_family=AF_INET;adr_inet.sin_port=htons(9000);if(!inet_aton(addr,&adr_inet.sin_addr) puts(bad address);net=inet_netof(adr_inet.sin_addr);printf(%14s: ,inet_ntoa(adr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论