logo资料库

实验1.CS模式文件传输网络应用开发.pdf

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
实验 1     C/S 模式文件传输网络应用开发   1、实验目的   2、对学生要求           通过实验了解C/S 模式下的网络应用开发基本方法,理解TCP 和UDP 并发。 服务器的基本原理,掌握  C/S   模式下的文件传输的网络应用的开发过程和方法。          1.   掌握UDP 循环服务器原理;          2.   掌握TCP 循环服务器原理;          3.   学会构建并发服务器;          4.   根据算法编写与实验内容相关的程序,该程序能实现文件服务器功能。           开发出支持UDP 和TCP 协议的服务器,且不同协议的服务器能够通过自己 定义的传输方法将文件传输给支持相应协议的客户端。           在UDP 方式的大文件传输,每次传输的文件大小超过一个数据包,必须考 虑数据包的切割分块问题。   3、实验内容   4、实验过程           (1)   构建并发服务器的基本思路           基本思路为服务器主线程等待客户端发起连接,接收到客户端请求时,创建一 个子线程为其提供服务。           主线程          1.   创建套接字并将其绑定到服务器所使用的熟知地址上。使该套接字处于 未连接状态;          2.   重复调用recvfrom 接收客户端的下一个请求,并且创建新的子线程处理         (2)   基于多线程方法构建   UDP   并发服务器的过程  
        (3)   基于多线程方法构建   TCP   并发服务器流程   响应。             子线程            1.   在线程创建时接收一个给定的请求,并访问套接字;          2.   根据应用协议构造应答,并调用  sendto   将应答发回给客户;            3.   退出(即子线程处理完一个请求后便终止)。             主线程          1.   创建套接字并将其绑定到服务器所使用的熟知地址上。使该套接字处于 未连接状态;          2.   将套接字设置为被动模式,使其准备为服务器所用;          3.   重复调用  accept   接收客户端的请求,并且创建子线程处理响应。           子线程   1.   在线程创建时接收连接请求(例如,针对连接的套接字);   2.   用该连接与客户端进行交互:接收请求并发回应答;   3.   关闭连接并退出。子线程在处理完来自一个客户端的所有请求后退出。   /*服务器端源程序*/   #include     #include     #include     #include     #include     #include     #include     #include     main()  {   char  c,  buf[1024],  file[30];   int  fromlen,  source;   int  k,  s,  ns;   struct  sockaddr_in  sin;   struct  hostent  *hp;   system(″clear″);   printf(″\n″);   printf(″\n\n\t\t 输入要传输的文件名:″);   5、参考内容  
scanf(″%s″,  file);   if  ((source  =  open(file,  O_RDONLY))  <  0){      perror(″源文件打开出错″);      exit(1);   }   printf(″\n\t\t 在传送文件,稍候…″);   hp  =  gethostbyname(″server″);   if  (hp  ==  NULL){          perror(″返回主机地址信息错!!!″);          exit(2);   }   s  =  socket(AF_INET,  SOCK_STREAM,  0);   if  (s  <  0)  {          perror(″获取SOCKET 号失败!!!″);          exit(3);   }   sin.sin_family  =  AF_INET;   sin.sin_port=htons(1500);/*使用端口1500*/   bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);   if  (bind(s,  &sin,  sizeof(sin))  <  0)  {        perror(″不能将服务器地址捆绑到SOCKET 号上!!!″);        colse(s);        exit(4);   }   if  (listen(s,5)<0)  {        perror(″sever:listen″);        exit(5);   }          while  (1)  {          if  ((ns  =  accept(s,  &sin,  &fromlen))<0)  {              perror(″sever:accept″);              exit(6);          }          /*   每次接受客户机连接,应将用于读的源文件指针移到文件头  */          seek(source,  OL,  0);                  write(ns,  file,  sizeof(file));  /*发送文件名*/          while  ((k  =  read(source,  buf,  sizeof(buf)))  >  0)  {                          write(ns,  buf,  k);                  }          printf(″\n\n\t\t 传输完毕!!!\n″);          close(ns);          }   close(source);   exit(0);  
6、思考题   }          1.   什么是并发服务器?          2.  TCP   并发服务器和  UDP   并发服务器的区别是什么?            3.   一般在什么情况下使用  UDP   并发服务器?          4.  TCP   并发服务器解决了  TCP   循环服务器的什么问题?同时又带来了什么 问题?    
分享到:
收藏