您好,欢迎访问三七文档
1计算机与信息技术学院综合性实验报告专业:年级/班级:2015—2016学年第一学期课程名称Linux/unix网络编程指导教师本组成员学号姓名实验地点计科楼111实验时间2015/11/16第五六节;2015/11/23第五六节;项目名称并发服务器编程实验类型综合性一、实验目的:掌握多进程服务器的编写模板;掌握多进程程序的编写方法。二、实验仪器或设备:一台装有Linux系统的计算机,三、总体设计(设计原理、设计方案及流程等):(1)服务器等待客户连接,连接成功后向客户发送欢迎信息;接着接收该客户的名字并显示;然后接收来自客户的信息(字符串),将该字符串进行凯撒加密(每个字母向后移三位)并将结果送回客户。要求服务器具有同时处理多个客户的能力,并把总访问量输出。(2)客户首先与服务器连接,接收用户输入客户的名字,将该名字发送给服务器;接着接收用户输入的字符串,并发送给服务器;然后接收服务器返回的经处理后的字符串,并显示出来。当用户输入Ctrl+D时终止连接并退出。四、实验步骤(包括主要步骤、代码分析等)例(1):if((listenfd=socket(AF_INET,SOCK_STRAM,0))==-1)//调用socket创建用于监听客户端的socket。服务器端判断对客户端发送来的信息能否成功监听,如果返回值为-1,则监听失败。Listenfd是由socket函数产生的套接字描述符,调用socket()函数,将其设置为监听描述符。socket函数是任何套接口网络编程中第一个使用的函数,它向用户提供一个套接字,即套接口描述文件字,它是一个整数,如同文件描述符一样,是内核标识一个IO结构的索引。AF_INET:使用IPv4作为协议簇;SOCK_STRAM:使用字节流类型;0代表使用系统针对IPv4与字节流的默认的协议,一般为TCP。例(2):if(bind(listenfd,(structsockaddr*)&server,sizeof(structsockaddr))==-1)调用bind绑定地址。调用bind()函数将描述符listenfd与server套接字地址结构中的协议地址绑定。即绑定函数的作用就是为调用socket()函数产生的套接字分配一个本地协议地址,建立地址与套接字的对应关系。2(structsockaddr*)&server这个是一个强制类型转换,就是将结构体&server强制转换成structsockaddr*类型。例(3):if(listen(listenfd,BACKLOG)==-1)套接字listenfd进行监听参数listenfd是要设置的描述符。参数Backlog规定了请求队列中的最大连接数,它对队列中等待服务请求的数目进行了限制。如果一个服务请求到来时,输入队列已满,该套接字将拒绝连接请求。例(4):if((connectfd=accept(listenfd,(structsockaddr*)&client,&sin_size))==-1)与客户端建立连接调用accept()函数,接收连接请求,返回已连接套接字connectfd描述。与服务器连接的客户端的协议地址可以通过参数client得到,包括IP地址和端口号等;sin_size参数用来返回连接对方对应的结构长度。Listenfd参数是由socket()函数产生的套接字描述符,在调用accept()函数之前,已经调用listen()函数将此套接字变成了监听套接字。Connectfd是连接套接字描述符。例(5):staticinti=-1;//设置全局静态变量……While(1){i++;//计算并发服务器的访问量printf(并发访问量:%d\n,i);……if((pid=fork())0)/*Theparent'sprocessisrunning*/{close(connectfd);continue;}elseif(pid==0)/*Thechild'sprocessisrunning*/{close(listenfd);process_client(connectfd,client);//建立通信exit(0);}else/*Forkerror*/{perror(Forkerror.\n);exit(0);}TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况。并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是服务器创建一个子进程来处理。为了响应客户机的请求,服务器要创建子进程来处理.而创建子进程是一种非常消耗资源的操作。3使用静态变量i,进入while循环时,开始累加并发服务器的和。例(6):设置凯撒加密:(来自客户端的每个字母经过服务器处理后向后移3位)for(i=0;irecvlen;i++){if(recvbuf[i]=='X'){sendbuf[i]='A';}elseif(recvbuf[i]=='x'){sendbuf[i]='a';}elseif(recvbuf[i]=='Y'){sendbuf[i]='B';}elseif(recvbuf[i]=='y'){sendbuf[i]='b';}elseif(recvbuf[i]=='Z'){sendbuf[i]='C';}elseif(recvbuf[i]=='z'){sendbuf[i]='c';}else{sendbuf[i]=recvbuf[i]+3;}}recvlen函数的作用是接收固定长度的数据。recvbuf[]用于接收数据;sendbuf[]用于发送数据。首先运行服务器端程序:名为yangyanwen的客户端与服务器端建立连接:4名为aaaaaa的客户端与服务器端建立连接:名为cccccccc的客户终端与服务器建立连接:五、结果分析与总结:万事开头难,网络编程没什么好害怕的,不要总以为自己什么都不会,如果不去尝试,那么自己就真的什么都不会了。在做实验的开始,也许我们会遇到各种各样的困难,但是不要气馁,方法总比困难多。只要我们坚持不懈努力,就一定可以取得成功。教师签名:年月日
本文标题:并发服务器编程
链接地址:https://www.777doc.com/doc-2455956 .html