首页 UNIX网络编程论文

UNIX网络编程论文

举报
开通vip

UNIX网络编程论文UNIX网络编程论文 课 程: 计算机网络应用 班 级: 041071 学 号: 04107128 姓 名: 侯聪 指导教师: 张玉清 提交日期: 2010-7-13 实验目的: 1)熟悉Linux操作系统 2)掌握Linux下进行程序编写、调试和运行的方法 3)掌握网络编程方法,设计具有并发服务功能的服务器-客户端程序,实现字符 串的反转和文件的传输功能。 实验过程: 服务器与客户端通信部分的设计思路: 主要的设计思路是服务端和客户端的通信部分,其他的功能都是基于通信的基础上的,所以在这里我主要介...

UNIX网络编程论文
UNIX网络编程论文 课 程: 计算机网络应用 班 级: 041071 学 号: 04107128 姓 名: 侯聪 指导教师: 张玉清 提交日期: 2010-7-13 实验目的: 1)熟悉Linux操作系统 2)掌握Linux下进行程序编写、调试和运行的方法 3)掌握网络编程方法,设计具有并发服务功能的服务器-客户端程序,实现字符 串的反转和文件的传输功能。 实验过程: 服务器与客户端通信部分的设计思路: 主要的设计思路是服务端和客户端的通信部分,其他的功能都是基于通信的基础上的,所以在这里我主要介绍通信部分的设计思路。 并发服务功能程序参用的是SOCKET网络编程,服务器与客户端参用TCP可靠连接方式,在通信过程中,服务器和客户端都有自己各自的工作方式。在本程序中服务器采用并发工作方式,主服务器进程在熟知端口等待客户进程发出的请求。一旦收到客户的请求,就创建一个从属服务器,并指明从属服务器使用临时插口和该客户进行通信,然后主服务器继续在原来的熟知端口等待向其他客户提供服务。 服务器的工作方式为:服务器启动时创建SOCKET,接着用bind函数将SOCKET与本地端口进行绑定,建立监听等待客户端的接入,当客户端进行连接时,服务器就创建一子进程为该客户端的通信服务,等通信结束子进程就退出。 客户端的工作方式为:客户端启动时先是创建SOCKET,接着通过设置的IP地址及端口号向服务器进行连接,并由此和服务器进行数据通信。 第一个程序:字符串翻转 一、 程序的基本要求 在linux平台设计客户端和服务器两个程序,实现客户端发送文本,服务器接收到文本后反序,传送回客户端,客户端进行显示。 二、程序的设计思想 本程序需要实现的方面是:客户端向服务端发送一条字符串,服务端接受该字符串后,将该字符串反序并传回给客户端并在客户端的界面上显示出来。 1、服务端的设计: 在运行程序是要先运行服务器程序,服务端根据客户端提出的请求提供相应服务: 服务端运行后等待客户端连接,当收到从客户端发送过来的请求后进行连接,建立连接后等待客户端发送请求,接收客户端发送的数据,接收完毕后,将接收到的字符串进行反序并想客户端传输,传输结束后关闭链路。 2、客户端的设计: 在服务端已经正常运行之后,运行客户端程序: 客户端发出请求连接的信号,之后建立连接并想服务端发送字符串,等待服务端响应, 之后接收从服务端传回的数据,接收完毕后将其显示在客户端界面上。 二、 程序运行效果图 客户端发送字符串:My name is Houcong~ 服务器将其反序后传回给客户端。 附录:(主要程序的代码) 服务器程序代码: #include #include #include #include #include #include #include #include #define serverport 5060 #define maxlen 10 int main() { //FILE *fp; int sockfd,client_fd; socklen_t sin_size; struct sockaddr_in server_addr; struct sockaddr_in client_addr; char msg[]={"*********Welcome to Houcong's Server!*********"}; void recv_reserve(char *buf); if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//create a socket { perror("create socket error!"); exit(-1); } server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(serverport); //server_addr.sin_addr.s_addr=INADDR_ANY; //inet_aton("127.0.0.1",server_addr.sin_addr.s_addr); bzero(server_addr.sin_zero,8); //fill the server_addr; if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1) { perror("bind error!"); exit(-1); } if(listen(sockfd,maxlen)==-1) { perror("listen error!\n"); exit(-1); } while(1) { sin_size=sizeof(struct sockaddr_in); if((client_fd=accept(sockfd,(struct sockaddr *)&client_addr,&sin_size))==-1) { perror("accept error!\n"); continue; } printf("\nreceived a connection from %s\n",inet_ntoa(client_addr.sin_addr)); if(!fork()) { char buffer[1024]; int n=0; if(write(client_fd,msg,strlen(msg))==-1) perror("send error!\n"); if((n=read(client_fd,buffer,1024))==-1) perror("read error!\n"); /*if((fp=fopen("s_backup","ab"))==NULL) { printf("cannot open/crate a file!"); exit(0); } fwrite(msg,strlen(buffer),1,fp); */ buffer[n]='\0'; printf("Received the message from the client: %s\n",buffer); recv_reserve(buffer); if(write(client_fd,buffer,strlen(buffer))==-1) { perror("error in write!\n"); } printf("After reverse: %s\n",buffer); close(client_fd); exit(0); //fclose(fp); } else close(client_fd); } close(sockfd); return 0; } void recv_reserve(char *buf) { char *p,*q,temp; p=q=buf; while(*q!='\0')q++; q--; while(p #include #include #include #include #include #include #include #define servport 5060 //#define maxdatasize 1024 int main() { //FILE *fp; int sockfd=0; int recvbytes=0; char buf[1024]; struct sockaddr_in serv_addr; int reverse(char a[],int len); if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket error!\n"); exit(1); } serv_addr.sin_addr.s_addr=inet_addr("192.168.25.128"); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(servport); bzero(serv_addr.sin_zero,8); if(connect(sockfd,(struct sockaddr *)(&serv_addr),sizeof(struct sockaddr))==-1) { perror("connect error!"); exit(1); } bzero(buf,1024); if((recvbytes=read(sockfd,buf,1024))==-1) { perror("read error!"); exit(1); } buf[recvbytes]='\0'; printf("%s\n",buf); bzero(buf,sizeof(buf)); strcpy(buf,"My name is Houcong!"); if(write(sockfd,buf,sizeof(buf))==-1) { perror("error in write!"); exit(1); } printf("Send the message from client: %s\n",buf); bzero(buf,1024); if((recvbytes=read(sockfd,buf,1024))==-1) { perror("recv error!"); exit(-1); } buf[recvbytes]='\0'; printf("Received the message from server: %s\n",buf); close(sockfd); //fclose(fp); return 0; } 第二个程序:文件传输 一、程序的基本要求 本程序是在原先相互通信的程序上作进一步的改进。该程序要求客户端向服务器发送一个文件名(服务器上事先存有该文件),服务器收到报文后进行解析,从本地读取该文件,把该文件的内容发送给客户端,客户端将接收到的数据拷贝在本地的硬盘上,以实现文件的下载。 二、程序的设计思想 1、服务端的设计: 在运行程序是要先运行服务器程序,服务端根据客户端提出的请求提供相应服务: (1)打开一通信通道并告知本地主机,它在某一段口上接收客户请求; 因此利用socket函数建立套接字,并用bind函数端口50301命名为套接字。本机的IP为:192.168.25.128 (2)在建立一个套接字后,服务器开始运行,等待客户端的连接,连接条件是客户端发送连接请求“getlist”,当服务端接受到客户端发送的命令并检验匹配后,连接成功。服务端向客户端传送欢迎信息,并且将可供下载的文件目录传给客户端,供客户端进行选择。 (3) 当服务端收到客户端发送的下载请求后,将目标文件传送给客户端,该进程服务完成后,关闭此新进程与客户的通信链路,并终止。 2、客户端的设计: 在服务端已经正常运行之后,运行客户端程序: (1)同服务器方一样,首先需要 打开一通信通道,并连接到服务器所在主机的特定端口50601。只有服务器和客户端的通信端口号一致才能连接成功。 (2) 向服务器发服务请求报文,等待并接收应答。 (3)接收从服务器端发回给客户端的数据,在本程序中接收的是服务器中指定文件夹下的文件目录,客户端输入要下载的文件全称并传给服务端,服务端接收后开始向客户端传送该文件的数据,传输的数据量的最大值不能超过 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 的最大值。 (4)数据传送完毕后,客户端将收到的文件数据进行拷贝,并命名为download,然后进行存盘。 三、程序运行效果图 程序的运行界面如下图: (1)启动服务器和客户端 服务器默认端口地址为50601。服务器启动后即开始监听端口,等待有客户端连接。 服务器和客户端运行效果如下: (2)从客户端输入下载命令(在本程序中直接输入文件名即可) 客户端发送请求后的效果图如下: (3)初始状态下的客户端文件夹没有内容,如下图所示: (4)初始状态下的服务器文件夹中可供下载的文件: (5)下载完成后创建的Download文件 (6)下载的文件与服务器中的文件进行对比(内容一致): 四、实验中的不足与期望 经过几天的不懈努力,这两个程序终于搞定了,对于第一个程序而言,相对简单一些,也没有什么觉得不满的地方。关键是第二个程序,直到程序完成我都觉得不满意,因为局限性太大了,在程序中,给客户端提供的功能是下载功能,但是从服务端传送过来的文件目录都是同一个文件夹下的,并且是我指定的文件夹下的文件目录,如果要下载的文件不在该目录中就无法下载。所以这是第一个问题。第二个问题是用户下载后的文件都是同一命名的,名称为:download.txt,而用户不能在下载时自己进行命名。第三个问题是程序的功能太少,操作起来也不够灵活。 这些都是我在以后的编程学习过程中需要改进的地方。 五、实验体会 从老师布置作业,到程序的真正完成,用了整整5天时间。程序看似简单,其实包含了许多知识,很多地方直到现在都是一知半解,只是知道是做什么的,在哪里用,并不知道它的真正作用,在整个程序中的意义。在做字符串反转的时候,仅仅是将老师的程序加以修改,增加了反转函数和函数调用就实现了第一个程序的制作,但是当做到文件传输的时候,各种各样的问题就接踵而来了。虽然老师一直说这个程序只要在原先作业基础上作进一步的扩展就行了,但是毕竟功能实现不一样,用到的代码也就不一样,仅仅靠上一个作业是不可 能的,所以我就通过man.chinaunix.net来查阅相关知识,终于做到了简单的文件传输。可是如果要将这个程序做的漂亮,是很麻烦的一件事,就拿服务器向客户端传送文件目录来说吧。首先服务端如何得到该文件夹的文件目录我就不知道如何来实现,只好找学长帮忙,后来终于知道要用opendir、readdir和closedir这几个函数来实现。定义了一个文件读取函数readfile()并在服务器程序中进行调用,好不容易能在服务端得到文件目录后,在目录的传输上又遇到了问题,这接二连三的问题搞的我很郁闷。后来我定义了一个字符串menu【100】,将目录导入到这个字符串中,一次性向客户端发送过去,终于实现了这个功能。 Linux网络编程是一门非常实用的课程,对我们以后很有帮助。转眼间,第一阶段的小学期的学习就要结束了,通过该阶段的学习,使我在各方面得到了一次锻炼,不管是编程能力上还是在思维能力上都有了不少的进步。对于一个程序员来说,编程思想的进步具有很重大的意义。虽然学习的时间不长,我也只是解除到linux编程最基础的部分,但是通过一周多的学习,一只脚已经跨进linux编程的大门之内了,相信通过自己的努力,一定能掌握这一门实用的技术~ 致谢:感谢张玉清老师的辛勤教学。每次上您的课都让我收获颇丰~ 附录:(主要程序的代码) 服务器程序代码: #include #include #include #include #include #include #include #include #include #include #include #define serverport 50601 #define maxlen 10 //***************************************************************** void readfile(char menu[]) { DIR * dir; struct dirent * ptr; int i; dir =opendir("/home/mentyhou/houcong"); while((ptr = readdir(dir))!=NULL) { printf("d_name: %s\n",ptr->d_name); strcat(menu,ptr->d_name); } closedir(dir); return ; } //******************************************************************** int main() { char l[]="************Welcome to Houcong's Server!!^_^********** \n"; char menu[100]={0}; int sockfd,client_fd; socklen_t sin_size; struct sockaddr_in server_addr; struct sockaddr_in client_addr; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)//create a socket { perror("create socket error!"); exit(-1); } server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(serverport); bzero(server_addr.sin_zero,8); if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1) { perror("bind error!"); exit(-1); } if(listen(sockfd,maxlen)==-1) { perror("listen error!\n"); exit(-1); } while(1) { sin_size=sizeof(struct sockaddr_in); if((client_fd=accept(sockfd,(struct sockaddr *)&client_addr,&sin_size))==-1) { perror("accept error!\n"); continue; } printf("\nreceived a connection from %s\n",inet_ntoa(client_addr.sin_addr)); write(client_fd,l,strlen(l)); if(!fork()) { char buffer[1024]; ////////////////////////// int m=read(client_fd,buffer,1024); buffer[m]='\0'; printf("%s\n",buffer); if(strcmp(buffer,"getlist")==0) { bzero(buffer,1024); //bzero(menu,100); readfile(menu); strcat(menu,"\n"); strcat(menu,"********Please choose the file which you want锛?******\n"); write(client_fd,menu,strlen(menu)); //write(client_fd,buffer,strlen(buffer)); } bzero(buffer,1024); int n=read(client_fd,buffer,1024); // buffer[n]='\0'; //**************************************************************** int fd_a=open(buffer,O_RDONLY); bzero(buffer,1024); int k=read(fd_a,buffer,1024); if(write(client_fd,buffer,k)==-1) { perror("error in write!\n"); } //*************************************************************** close(client_fd); exit(0); } else close(client_fd); } close(sockfd); return 0; } 客户端程序代码: #include #include #include #include #include #include #include #include #define servport 50601 //#define maxdatasize 1024 int main() { int sockfd=0; int recvbytes=0; char buf[1024]; struct sockaddr_in serv_addr; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket error!\n"); exit(1); } serv_addr.sin_addr.s_addr=inet_addr("192.168.25.128"); serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(servport); bzero(serv_addr.sin_zero,8); if(connect(sockfd,(struct sockaddr *)(&serv_addr),sizeof(struct sockaddr))==1) { perror("connect error!"); exit(1); } bzero(buf,1024); int y=-1; y=read(sockfd,buf,1024); printf("%s\n",buf); strcpy(buf,"getlist"); buf[strlen("getlist")]='\0'; write(sockfd,buf,strlen(buf)); bzero(buf,1024); recvbytes=read(sockfd,buf,1024); buf[recvbytes]='\0'; printf(" %s",buf); bzero(buf,1024); while(1) { scanf("%s",buf); int i=strcmp(buf,"Q"); if(i==0) break; write(sockfd,buf,strlen(buf)); int fd_b=creat("cli/Download.txt",0644); int k=-1; k=read(sockfd,buf,1024); printf("%s\n",buf); write(fd_b,buf,k); close(fd_b); } close(sockfd); return 0; }
本文档为【UNIX网络编程论文】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_215732
暂无简介~
格式:doc
大小:184KB
软件:Word
页数:22
分类:生活休闲
上传时间:2017-09-24
浏览量:22