当前位置:文档之家› 网络程序设计试题A卷-最新版本

网络程序设计试题A卷-最新版本

西安电子科技大学《网络程序设计》试题(2013 年 A 卷)考试时间120分钟试卷编号_________班级________ 学号___________ 姓名_________ 任课老师姓名_____________一、单选题(102分=20分)1 •以下字段中,不属于IP首部的是 _____A. 协议类型B. 生存时间C. 源IP地址D. 目的端口号2 •以下函数中,不会产生阻塞的是 ________A. send()B. sen dto()C. conn ect()D. liste n()3 •进程A是进程B的父进程,当A正在运行时B退出,下列叙述中正确的是_____A •进程A也将退出B .进程A将收到SIGCHLD信号D .进程A将收到SIGKILL信号D •进程A会成为僵尸进程4 .整数0x12345678在little-endian字节序主机内存中的存储形式是__________ (注:内存由低到高)A. 12 34 56 78B. 78 56 34 12C. 34 12 78 56D. 56 78 12 345 .使用信号驱动I/O时哪一个不是必须要执行的操作__________A .为信号SIGIO关联一个信号处理函数B .设置套接字为非阻塞模式C .设置套接字所有者D .允许套接字进行信号驱动I/O6. _______________________________________________________________ 对使用UDP协议的套接字调用connect函数,下面叙述中正确的是________________A . connect函数将阻塞B . connect函数将导致3次握手操作C. connect函数记录对方的IP地址和端口后立刻返回D .不能对使用UDP协议的套接字描述符调用connect函数7. 对函数调用send(sockfd, 12xyz”,5,MSG_OOB)的描述中正确的是 __________A .只有字符z被写入发送缓冲区B .只有字符串12xy被写入发送缓冲区C .字符串12xyz中的每个字符都将作为带外数据发送D . TCP协议发送的下一个报文段中URG标志将置位&在给网络地址附值时,程序如果使用“INADDR_ANY ”,则表明_______A .对于只有一个IP地址的主机,使用“ 127.0.0.1 ”地址B .对于有多个网卡的主机,使用其中任意一个IP地址C .对于有多个网卡的主机,表示所有IP地址,并处理所有地址的请求D .以上均不对9 .请求建立连接时TCP包头中的__________ 标志位有效A. SYNB. RSTC. PSHD. URG10 .当通信的对方关闭其写通道时,TCP套接字的读函数read()将_ _A.返回大于0的整数B.返回小于0的整数C.阻塞D.返回0二、判断下面命题的正确性,对不正确的命题,说明错误原因(5X 2=10分)1. 一般情况下,守护进程是在后台运行。

守护进程不考2. Browse/Server模型主要事务在服务器端实现,一部分事务在前端实现。

正确3. 阻塞式I/O是套接字的默认模型。

正确4. IP数据包首部中TTL=64表示数据包在网上的最大生存时间是64秒。

错误,TTL表示数据包在网上的最大生存时间,但单位不是秒,而是表示数据包可经过的最多的路由器数量,每经过一个路由器这个值-1。

当这个值减为0时网络设备将抛弃这个包。

5 .可以只用通信双方的IP地址来标识一条TCP网络连接。

错误,除了需要通信双方的IP地址外还需要通信双方的端口号。

三、简答题(5X 5分=25分)1.请简述4 种Linux 系统中进程间的通信机制。

(1)管道(pipe)和命名管道(named pipe/FIFO )( 2)信号( signal)( 3)消息队列( message queue)(4)共享内存(share memory)和内存映像文件( memory mapped file )(5)信号量( semaphore)( 6) UNIX 域socket2.套接字函数close( )与shutdown( ) 的差别?shutdown 操作连接通道,其他进程不能再使用已被关闭的通道;close 操作描述符,其他进程仍然可以使用该socket 描述符close 关闭应用程序与socket 的接口,调用close 之后进程不能再读写这个socket;shutdown 可以只关闭一个通道,另一个通道仍然可以操作3.请简述循环服务器模型和并发服务器模型的区别。

循环服务器:任一时刻只处理一个客户机请求,处理请求过程中下一请求等待,节省服务器资源,响应时间长,适合处理非耗时请求。

并发服务器:并发执行,每收到一个连接请求创建一个进程处理该连接,服务器继续等待下一连接,响应速度快,占用系统资源多。

4.怎样将阻塞式套接字转变为非阻塞式套接字?( 1 )函数fcntlint flags;flag=fcntl(sockfd,F_GETFL,0); fcntl(sockfd,F_SETFL,flag|O_NONBLOCK);( 2)函数ioctlint on=1;ioctl(sockfd,FIONBIO,&on);5.Linux 系统主要实现了哪几种输入/输出模型?请简述每种模型的特点。

阻塞式I/O 模型-默认I/O 模型编程简单,在进程被阻塞期间不占用CPU 时间,不影响其他进程的工作效率。

但进程可能长期处于休眠状态,在此期间进程不能执行别的任务,进程自身的效率不高。

非阻塞式I/O 模型变成相对复杂,当I/O 操作不能完成时,进程还可以执行后续的程序代码,提高了进程自身的工作效率。

但进程一直处于运行状态,可能占用大量的CPU 时间来检测I/O 操作是否完成,从而影响其他进程的运行效率。

多路复用I/O 模型只检查一个socket 描述符时和阻塞式I/O 模型类似,只是阻塞的位置不同,但效率低于阻塞式I/O模型,在多个socket描述符上进行I/O操作时效率高于阻塞式I/O信号驱动I/O模型等待I/O操作可以进行的过程中不用阻塞,可以执行其他操作,程序结构简单,更适用于UDP协议四、当服务器采用并发服务器进行有连接的通信时,采用以下程序段的编程模式来处理应用,请将程序的空白处完善。

(4X 3分=12分)int sockfd ,n ewsockfd;if ((sockfd = socket (…)<0)Err_sys ( “ socket error. ” );if ( bi nd (sockfd,…)<0)Err_sys ( “ error. ” );if ( liste n (sockfd,5)<0)Err_sys ( “ error. ” );for(;;){newsockfd = accept (sockfd, …);if (n ewsockfd < 0)Err_sys ( “ error. ” );if ( | fork() ] = =0){close(sockfd);〃用newsockfd处理具体连接请求doit (n ewsockfd);close( newsockfd); exit(0);}close( newsockfd);}五、阅读以下程序,详细说明该程序的功能。

(10分)void sigchld_ha ndler(i nt); int mai n(){struct sigacti on act; int i;act.sa_handler=sigchld_handler;act.sa_flags=0;sigemptyset(&act.sa_mask);if(sigaction(SIGCHLD,&act,NULL)<0){cout<<"sigaction error."<<endl;exit(1);}for(i=0;i<5;i++){i f(fork()==0){cout<<"child "<<getpid()<<endl;exit(0);}}for(;;){}return 0;}void sigchld_handler(int sig){pid_t pid;int stat;for(;(pid=waitpid(-1,&stat,WNOHANG))>0;){ cout<<"child"<<pid<<"died:"<<WEXITSTATUS(stat)<<endl;}}本程序通过循环过程生成了五个子进程,子进程将打印出他们自己的进程号,然后以status=0 退出。

由于本程序设置了信号SIGCHLD 的处理,在处理函数sigchld_handler 中,父进程接收到子进程发来的SIGCHLD 信号时将打印出子进程的进程号以及退出状态。

六、使用UDP 套接字编程(13 分)客户机发送20 个整数给服务器,服务器在其中找到这些整数的最大值,返回给客户机。

不考UDP七、编写一个服务器程序,使其能够实现TCP 并发服务,并且打印出每个连接成功的客户端的IP 地址及其端口号(10 分)#include ...#define SERVPORT 3333 /* 服务器监听端口号*/#define BACKLOG 10 /* 最大同时连接请求数*/int main(void){int sin_size;int sockfd, new_fd;struct sockaddr_in server_addr;struct sockaddr_in client_addr;// 建立套接字sockfd=socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1){perror("socket creat error!");exit(1);}// 填充地址bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVPORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY);// 绑定if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) {perror("bind error !");exit(1);}最新可编辑 word 文档// 监听if (listen(sockfd, BACKLOG) == -1){perror("listen error ! ");exit(1);}while(1){sin_size = sizeof(struct sockaddr_in);if ((new_fd = accept(sockfd, (struct *)&client_addr,&sin_size)) == -1){perror("accept error!"); continue;}printf("client addr:%s inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));if (!fork()){/* 子进程代码段 *//* do something */ /* ........... *//* do something */ close(new_fd); exit(0);}close(new_fd);}return 0;[此文档可自行编辑修改,如有侵权请告知删除,感谢您的支持,我们会努 力把内容做得更好 ]sockaddr%d\n",。

相关主题