ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:83.61KB ,
资源ID:7748605      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7748605.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(网络程序设计linux服务器课程设计报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

网络程序设计linux服务器课程设计报告.docx

1、网络程序设计linux服务器课程设计报告网络程序设计课程设计报告 目录第1章 课程设计目的、要求 11.1课程设计目的 11.2实验要求 11.3实验内容 11.4小组分工 1第2章 课程设计分析及内容 22.1所用知识点 22.1.1套接字函数 22.1.2守护进程 22.1.3 I/O复用 22.1.4 并发服务器 3第3章 课程设计的实现 43.1 程序运行步骤 43.2 客户端主要函数 53.2.1 socket()函数 53.2.2 connect()函数 53.3服务端函数 63.3.1 send函数和recv函数 63.3.2 close()函数 63.3.3 select函数

2、73.4 创建守护进程 7心得体会 8附录一 系统界面 9附录二 程序代码 10第1章 课程设计目的、要求1.1课程设计目的 1.熟练掌握所学到的网络套接字函数。 2.掌握UDP和TCP编程关键函数。 3.掌握多进程或多线程编程。 4.掌握使用select实现I/O复用。 5.掌握守护进程的编写。1.2实验要求 1.认真阅读和掌握本实验的相关的知识点。 2.上机编写并运行程序。1.3实验内容 实现一个并发、IO复用的守护进程时间服务器,要求当客户端向服务器发送“whats time?”字符串时,服务器回应当时的系统时间字符串。1.4小组分工成员负责内容梁小龙 任务书、课程设计资料查询、代码测试

3、杨国浩 服务器端程序I/O复用模块分析与设计杨天 客户端clinet整体程序、课程设计报告豆全胜 服务器端守护进程模块与主函数模块第2章 课程设计分析及内容2.1所用知识点2.1.1套接字函数客户端所用函数:socket()函数、connect()函数、send()函数、recv()函数,close()函数。服务器端所用函数:bind()函数、socket()函数、listen()函数、accept()函数、send()函数、accept()函数、recv()函数、close()函数。2.1.2守护进程 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长

4、的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的。 每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能够突破这种限制,它从被执行开始运转,直到整个系统关闭时才退出。如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程。2.1.3 I/O复用 I/O复用调用select或poll,并在该函数上阻塞,等待数据报套接口可读;当se

5、lect返回可读条件时,调用recvfrom将数据报拷贝到应用程序缓冲区中。主要应用:(1)客户程序需要同时处理交互式的输入和服务器之间的网络连接。(2)客户端需要对多个网络连接作出反应。(3)TCP服务器需要同时处理多个处于监听状态和多个连接状态的套接字。(4)服务器需要处理多个网络协议的套接字。(5)服务器需要同时处理不同的网络服务和协议。2.1.4 并发服务器 不同于顺序服务器,并发服务器就要能在一个时间为多个客户端提供服务。 例如,一个聊天服务器可能服务一个特定的客户端数小时在停止为这个客户端服务之前服务器不能等待, 除非是在等待一下个客户端到来之前的间隙才能等待。 第3章 课程设计的

6、实现3.1 程序运行步骤对于服务器端而言,由于它是一个守护进程所以只要做到接收信息并且存储在一个数组中即可而不必在前台显示,对于客户端必须有信息的发送和接收。服务器端必须对来自客户端的信息加以判断。如果接收到的字符串与“whats_time?”字符串行匹配那么则返回给客户端一个系统的时间信息,否则返回给客户端“Input error”的字符串。如下图所示:图3-1连接流程图3.2 客户端主要函数3.2.1 socket()函数 socket()函数用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。创建一个套接口,代码如下: #include SOCKET PASCAL

7、 FAR socket( int af, int type, int protocol); Af是一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式,Type是新套接口的类型描述,protocol:套接口所用的协议,如调用者不想指定,可用0指定,表示缺省。3.2.2 connect()函数 本函数用于创建与指定外部端口的连接。s参数指定一个未连接的数据报或流类套接口。如套接口未被捆绑,则系统赋给本地关联一个唯一的值,且设置套接口为已捆绑。请注意若名字结构中的地址域为全零的话,则connect()将返回WSAEADDRNOTAVAIL错误。返回值:若无错误发生

8、,则connect()返回0。否则的话,返SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。创建一个连接,代码如下: #include /调用套接字 int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR* name,int namelen); s是标识一个未连接套接口的描述字。 Name是欲进行连接的端口名。 Namelen是名字长度。3.3服务端函数3.3.1 send函数和recv函数1.send函数int send( SOCKET s,const char FAR *buf,i

9、nt len,int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。 客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 第一个参数指定发送端套接字描述符。 第二个参数指明一个存放应用程序要发送数据的缓冲区。 第三个参数指明实际要发送的数据的字节数。 第四个参数一般置0。2.recv函数 int recv( SOCKET s,char FAR *buf,int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 第一个参数指定接收端套接字描述符。

10、 第二个参数指明 一个缓冲区,该缓冲区用来存放recv函数接收到的数据。 第三个参数指明buf的长度。 第四个参数一般置0。3.3.2 close()函数close函数用于关闭套接字,并立即返回到进程。关闭后的套接字描述符不能再接收和发送数据,再不能作为函数send()或recv()的参数。如果套接字描述符访问计数在调用close后大于0(在多个进程共享同一个套接字的情况下),则不会引发TCP终止序列(即不会发送FIN分节)。3.3.3 select函数select()的机制中提供一fd_set的数据结构,实际上是一long类型的数组, 每一个数组元素都能与一打开的文件句柄(不管是Socket

11、句柄,还是其他 文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成, 当调用select()时,由内核根据IO状态修改fd_set的内容,由此来通知执 行了select()的进程哪一Socket或文件可读。3.4 创建守护进程创建步骤:使进程在后台运行脱离控制终端,登录会话和进程组(创建新会话)禁止进程重新打开控制终端关闭所有文件描述符改变当前工作目录重设权限掩码处理SIGCHLD信号心得体会 经过两周的课程设计,我们对Linux有了更深的体会,意识到只有动手去操作才能真的掌握它。同样也对服务器有了多重的认识,认识到其在生活中的重要性,和我们的生活密不可分。 时间服务器更是重中所重

12、,时间的重要性越来越大,时间服务器作为时间的核心其重要性已经不言而喻,且开发成本较小,用时较少,易于开发。不仅为我们以后的程序生涯打好基础,也能增加我们对编写程序的兴趣。 这次之后,我们小组还算是比较默契的。没想到这项看起来不需要多少技术的工作却是非常需要耐心和精力,在两周后的今天我已明白课程设计对我来说的意义,它不仅仅是让我们把所学的理论知识与实践相结合起来,提高自己的实际动手能力和独立思考的能力,更重要的是同学间的团结,虽然我们这次花去的时间比别人多,但我相信我们得到的也会更多。 在这次课程设计中,我们运用到了以前所学的专业课知识,比如并发服务器原理,I/O复用技术,守护进程的创建。正如孔

13、子所说:“温故而知新”,我们在开发的过程中有时会遇到问题,等到解决之后,发现自己知道了更多的东西,对知识点有了更深刻的理解。 这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。其次,这次课程设计让我充分认识到团队合作的重要性,只有分工协作才能保证整个项目的有条不絮。另外在课程设计的过程中,当我们碰到不明白的问题时,指导老师总是耐心的讲解,给我们的设计以极大的帮助,使我们获益匪浅。因此非常感谢老师的教导。附录一 系统界面 附录二 程序代码客户端程序:#include #include #include #include #include #include #include #

14、define PORT 1234#define MAXDATASIZE 100#define MAXLINE 100int main(int argc,char * argv) int fd,numbytes; char bufMAXDATASIZE,sendlineMAXLINE; struct hostent * he; struct sockaddr_in server; if (argc != 3) fprintf(stderr,usage: %s address and myportn, argv0); exit(1); if(he=gethostbyname(argv1)=NULL

15、) perror(gethostbyname error.); exit(-1); if(fd=socket(AF_INET,SOCK_STREAM,0)=-1) perror(Create socket failed); exit(1); else printf(Connect Success!n); bzero(&server,sizeof(server); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr=*(struct in_addr *)he-h_addr); if(connect(fd,

16、(struct sockaddr *)&server,sizeof(struct sockaddr)=-1) perror(Bind error.); exit(1); if(numbytes=recv(fd,buf,MAXDATASIZE,0)=-1) perror(recv error.); exit(1); bufnumbytes=0; printf(Server Message: %sn,buf); close(fd);服务器端程序:#include #include #include #include #include #include #include include #defin

17、e PORT 1234#define BACKLOG 5#define MAXLINE 255#define MAXFD 64void demon_init(const char *pname,int facility) int i; pid_t pid; if(pid=fork()!=0) exit(0); setsid(); signal(SIGHUP,SIG_IGN); if(pid=fork()!=0) exit(0); chdir(/); umask(0); for(i=0;iMAXFD;i+) close(i); openlog(pname,LOG_PID,facility);in

18、t main(int argc,char *argv) int listenfd,connfd; socklen_t addrlen,len; struct sockaddr_in client_addr; struct sockaddr_in server; char buffMAXLINE; time_t ticks; bzero(&server,sizeof(server); bzero(&client_addr,sizeof(client_addr); server.sin_family=AF_INET; server.sin_port=htons(1234); server.sin_

19、addr.s_addr=htonl(INADDR_ANY); demon_init(argv0,0); if(listenfd=socket(AF_INET,SOCK_STREAM,0)=-1) syslog(LOG_NOTICE|LOG_LOCAL0,socket error); exit(-1); if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr)=-1) syslog(LOG_NOTICE|LOG_LOCAL0,socket error); exit(-1); if(listen(listenfd,BAC

20、KLOG)=-1) exit(-1); for(;) len=sizeof(client_addr); connfd=accept(listenfd,&client_addr,&len); ticks=time(NULL); snprintf(buff,sizeof(buff),%.24srn,ctime(&ticks); int a; if(a=write(connfd,buff,strlen(buff)=-1) syslog(LOG_NOTICE|LOG_LOCAL0,write error); exit(0); int fd_ABACKLOG; int conn_amount; int

21、ret; int i,new_fd; fd_set fdsr; int maxsock; struct timeval tv; conn_amount = 0; maxsock = listenfd; while (1) FD_ZERO(&fdsr); FD_SET(listenfd, &fdsr); tv.tv_sec = 30; tv.tv_usec = 0; for (i = 0; i BACKLOG; i+) if (fd_Ai != 0) FD_SET(fd_Ai, &fdsr); ret = select(maxsock + 1, &fdsr, NULL, NULL, &tv);

22、if (ret 0) perror(select); break; else if (ret = 0) printf(timeoutn); continue; for (i = 0; i conn_amount; i+) if (FD_ISSET(fd_Ai, &fdsr) ret = recv(fd_Ai, buff, sizeof(buff), 0); if (ret = 0) printf(client%d closen, i); close(fd_Ai); FD_CLR(fd_Ai, &fdsr); fd_Ai = 0; else if (ret MAXLINE) memset(&bu

23、ffret, 0, 1); printf(client%d send:%sn, i, buff); if (FD_ISSET(listenfd, &fdsr) new_fd = accept(listenfd, (struct sockaddr *)&client_addr, &len); if (new_fd = 0) perror(accept); continue; if (conn_amount maxsock) maxsock = new_fd; else printf(max connections arrive, exitn); send(new_fd, bye, 4, 0); close(new_fd); break; for (i = 0; i BACKLOG; i+) if (fd_Ai != 0) close(fd_Ai);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1