您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 西电2015网络程序设计大作业
西安电子科技大学网络程序设计实验报告班级:姓名:学号:西安电子科技大学《网络程序设计》实验报告2015年度实验一:1.linux平台上的TCP并发服务一、实验内容掌握基本套接字函数使用方法、TCP协议工作原理、并发服务原理和编程方法。实验内容:在linux平台上实现1个TCP并发服务器,至少可以为10个客户端同时提供服务。(1)基于TCP套接字编写服务器端程序代码,然后编译和调试;(2)服务器程序要达到:可以绑定从终端输入的IP地址和端口;可以显示每一个进程的进程号;可以显示当前并发执行的进程数量;可以根据客户机要求的服务时间确定进程的生存时间。(3)基于TCP套接字编写客户端程序代码,然后编译和调试;(4)客户端程序要达到:可以从终端输入服务器的IP地址和端口;可以从终端输入对服务器的服务时间要求。(5)联调服务器和客户端,服务器每收到一个连接就新建一个子进程,在子进程中接收客户端的服务时间请求,根据所请求的时间进行延时,然后终止子进程。如:客户端请求服务10s,则服务器的子进程运行10s,然后结束。(6)服务器要清除因并发服务而产生的僵尸进程。二、分析及设计要实现并发的服务器,也就是要求在同一段时间内,服务器能处理多个不同的客户端的请求,并且要区分出它们各自差别,然后做到区别对待——这里只要用各自的进程的fd来区分各自的身份。不过这里因为水平有限,没有实现各个客户端各自定一个服务时间,服务时间是按照客户端连接到退出的这段时间,也就是要客户端主动退出。西安电子科技大学《网络程序设计》实验报告2015年度三、详细实现服务器端:负责接收客户端的信息,然后在区分各个客户端的前提下,将信息复述出来。以下是各种参数的初始定义;生成服务端进程套接字及初始化;西安电子科技大学《网络程序设计》实验报告2015年度调用bind()和listen()函数来绑定套接字地址和句柄以及坚挺服务请求;select()函数可以设置超时,是长期没有文件描述符就绪时,进程可以跳出阻塞状态;之后的各种情况跳转判断,请看附录的详细代码客户端:各种参数以及初始化,因为客户端逻辑功能较少,因此参数的个数也不及服务器端的多;调用connect()函数,将该套接字和服务器套接字相连接;从命令行读入信息;其余代码见附录。西安电子科技大学《网络程序设计》实验报告2015年度四、实验结果西安电子科技大学《网络程序设计》实验报告2015年度实验二:进程间的协调通信一、实验内容掌握进程的概念、进程间通信的基本原理、集成间通信的主要类型和各自的特点。实验内容:在linux平台上实现1个父进程、2个子进程,利用管道和共享内存实现两个子进程之间数据快速传送。(1)创建一个进程,再创建一对管道、一块共享内存(大于64kB);(2)通过fork()函数生成2个子进程;(3)调试程序,确定父、子进程之间可以双向通信;(4)调试程序,确定两个子进程之间可以通过父进程中转实现双向通信;(5)调试程序,确定两个子进程都可访问共享内存;(6)实现两个子进程之间无冲突地访问共享内存。传送的数据块不小于32kB,为了能够看到演示效果,读/写每个字节后都延时0.5ms。二、分析及设计管道:管道又可以分为无名管道和命名管道,两者的用途是不一样的。无名管道PIPE:主要用于具有亲缘关系的进程之间的通信,无名管道的通信是单向的,只能由一段到另外一段;无名管道是临时性的,完成通信后将自动消失。一般采用先创建无名管道,再创建子进程,使子进程继承父进程的管道文件描述符,从而实现父子进程间的通信;在非亲缘关系管道之间,如果想利用无名管道进行通信,则需要借助另外的文件描述符传递机制。有名管道FIFO:有名管道是一个实际存在的特殊文件,利用有名管道可以实现同主机任意进程之间的数据交互。这里只需要无名管道,它只能在父子进程间传递信息,因此要求在两个子进程之间通信,必须以父进程为媒介,进程1将信息传给父类,然后由父类将信息传给进程2,以此来完成两子进程的一次通信。西安电子科技大学《网络程序设计》实验报告2015年度共享内存:通常由一个进程创建,其余进程对这块内存区进行读写。得到共享内存有两种方式:映射/dev/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的是实际的物理内存;常用的方式是通过shmXXX函数族来实现共享内存:如果一个进程通过fork创建了子进程,则子进程继承父进程的共享内存,既而可以直接对共享内存使用,不过子进程可以自身脱离共享内存。基于共享内存的通信,不需要父进程的帮助,只要将两个子进程与申请的进程块联系起来即可;主要的问题是两个子进程之间访问共享内存的互斥问题,必须等进程1写完内存后,进程2才能读取,顺序不能乱。这里其实又设计到了进程通信的另一种方式——信号量,不过这不是重点,因此只采用了最简单的方式,设置一把锁,然后两个子进程循环检查这个标志锁,然后根据锁来决定是否就可以实现这个功能。以下是共享内存的原理示意图:西安电子科技大学《网络程序设计》实验报告2015年度三、详细实现管道:调用pipe()来生成管道:调用fork()创建一个子进程,并实现数据写入到父进程中:其余代码略;共享内存:西安电子科技大学《网络程序设计》实验报告2015年度定义一个结构体:创建一个共享内存并且将之连接到当前进程的地址空间:一个进程负责内存写入:(读进程类似)Process_Write()和Process_Read()代码偏长,详见附录;西安电子科技大学《网络程序设计》实验报告2015年度四、实验结果管道:共享内存:其实可以看到进程间运行还是有些问题,Youwrote多次出现。这个问题需要跟完善的信号操作来实现完全的按序执行。西安电子科技大学《网络程序设计》实验报告2015年度实验三:Windows平台上的TCP并发服务一、实验内容编程内容与实验1相同,操作系统为windows。了解Windows与Linux平台编程环境的差异,掌握Winsock编程接口及编程方法。二、分析及设计Berkeley套接字刚开始时4.2BSDUnix操作系统(与1983年发布)的一套应用程序接口,设计之初就是为了实现TCP/IP协议。Berkeley套接字应用程序接口形成了事实上的网络套接字的标准。而微软当时为了迅速占据市场以及招聘人才,全盘套用了Unix的网络编程实现,其中就包括了Berkeley套接字。不过由于Unix和Windows的内核实现是有差别的,Berkeley套接字在Windows上的运行效率并不高,因此后来Windows推出了Winsock,并且为了预防AT&T申请专利,它被实现为一个与网络协议无关的网络编程接口。Winsock的实现一般在Berkeley套接字函数上加了前缀WSA用以区分。这个实验的具体实现其实和实验1没有实质上的区别,差别在于同样的功能要用不同的函数来实现。这个程序实现的比较简单,服务器和客户端只有一次交换信息。三、具体实现(具体阐述与linux的异同)服务器端:windwows下的socket编程函数库:各个参数及初始化:西安电子科技大学《网络程序设计》实验报告2015年度不同之处:同样是bind(),listen():其余代码略;客户端:connect()函数:使用完函数库,需要释放:西安电子科技大学《网络程序设计》实验报告2015年度四、实现结果心得体会:网络程序设计这门课是一门非常非常实用的课,可惜开课的时间不太合适,刚开始时,网络方面的知识实在是非常的欠缺,因此现在看来非常基础的socket,在那时是根本无法理解的,而后来随着课程的推进,各种实验上机接踵而来,也无法抽出时间来好好学习网络编程,浪费了很多时间,这让我感到很可惜,错过了学习这门课的最好时候。不过在这一段时间的补充学习,我还是追回来一点内容,至少不是两眼一蒙,不会啥都不认识了。Winsock的内容继承了Windows编程的一贯特点,艰涩难懂——至少对于还没入门的我是这种感觉的。强烈希望能够网络程序这门课放到大三下学期!西安电子科技大学《网络程序设计》实验报告2015年度附录:实验一:服务器端:#includestdio.h#includestdlib.h#includestring.h#includesys/time.h#includesys/types.h#includesys/socket.h#includenetinet/in.h#includesys/select.h#includeerrno.h#defineSERVER_IP127.0.0.1#defineSERVER_PORT8000#defineMAX_RECV_LEN1024//发送信息的最大长度#defineMAX_CLIENT_NUM30//并发数量#defineBACK_LOG20//等待队列staticintrunning=1;intmain(intargc,char*argv[]){intsock_fd=-1;//套接字文件描述符西安电子科技大学《网络程序设计》实验报告2015年度intret=-1;structsockaddr_inserv_addr;//服务器地址structsockaddr_incli_addr;//客户端地址socklen_tserv_addr_len=0;socklen_tcli_addr_len=0;intclient_fd[MAX_CLIENT_NUM];//客户端队列,用于区分各个客户端,并区分服务charrecv_buf[MAX_RECV_LEN];//缓冲区intnew_conn_fd=-1;//新进程的fdinti=0;intmax_fd=-1;intnum=-1;structtimevaltimeout;fd_setread_set;fd_setwrite_set;fd_setselect_read_set;FD_ZERO(&read_set);FD_ZERO(&write_set);FD_ZERO(&select_read_set);for(i=0;iMAX_CLIENT_NUM;i++){client_fd[i]=-1;//初始化}memset(&serv_addr,0,sizeof(serv_addr));//初始化memset(&cli_addr,0,sizeof(cli_addr));西安电子科技大学《网络程序设计》实验报告2015年度sock_fd=socket(AF_INET,SOCK_STREAM,0);//生成TCP/IP协议的套接字if(sock_fd0){perror(Failtosocket);//套接字生成失败exit(1);}serv_addr.sin_family=AF_INET;//TCP/IP协议族serv_addr.sin_port=htons(SERVER_PORT);//端口号,8000serv_addr.sin_addr.s_addr=inet_addr(SERVER_IP);//格式化(本地)IP地址unsignedintvalue=1;if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,(void*)&value,sizeof(value))0){perror(Failtosetsockopt);exit(1);}serv_addr_len=sizeof(serv_addr);if(bind(sock_fd,(structsockaddr*)&serv_addr,serv_addr_len)0)//绑定套接字地址和句柄{perror(Failtobind);exit(1);西安电子科技大学《网络程序设计》实验报告2015年度}if(listen(sock_fd,BACK_LOG)0)//调用listen(){perror(Failtolisten);exit(1);}charbuf[1024];max_fd=sock_fd;int
本文标题:西电2015网络程序设计大作业
链接地址:https://www.777doc.com/doc-5750329 .html