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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

实验一基于TCP套接字的文件传输客户服务器程序设计实验报告.docx

1、实验一基于TCP套接字的文件传输客户服务器程序设计实验报告2011年秋季学期计算机网络II实验报告考 核 科 目:计算机网络II学生所在院(系): 计算机科学与技术学院学生所在学科: 姓 名: 学 号: 实 验 时 间:2011年11月29日一、问题描述1. 实验名称:基于TCP套接字的文件传输客户服务器程序设计2. 实验目的: 掌握基于TCP套接口的网络程序设计。掌握大规模文件传输的基本方法。3. 实验要求:服务器程序分别实现迭代服务器,并发服务器,使用单进程和select的TCP服务器。 服务器在客户提出请求后向客户发送一个不小于1M大小的文件。二、概要设计1. 客户程序概要设计。创建TC

2、P套接口;指定服务器IP地址和端口;建立与服务器的连接;向服务器发送请求传送文件的请求“hello”;接受服务传输过来的数据;终止程序。2. 迭代服务器概要设计。 创建TCP套接口; 捆绑服务器众所周知端口到套接口; 把套接口变成监听套接口; 接受客户连接; 读取客户的请求,发送应答; 终止连接并等待下一个客户连接。3. 并发服务器概要设计。 创建TCP套接口; 捆绑服务器众所周知端口到套接口; 把套接口变成监听套接口; 接受客户连接;调用fork()派生子进程处理连接,父进程等待新的连接请求并处理结束的子进程; 子进程读取客户的请求,发送应答,数据传输结束后终止连接并退出。4. 使用单进程和

3、select的TCP服务器概要设计。 创建TCP套接口; 捆绑服务器众所周知端口到套接口; 把套接口变成监听套接口; 调用select初始化数据结构; 阻塞于select; 若监听套接字变为可读,accept新的连接;检查现有连接,若连接可读则读取客户请求,发送应答,数据传输结束后关闭当前连接并更新数据结构。三、详细设计1. 客户程序详细设计。a) 主要数据结构设计 ipv4套接字地址结构 struct in_addr in_addr_t s_addr; ; struct sockaddr_in uint8_t sin_len; sa_family_t sin_family; in_port_

4、t sin_port; struct in_addr sin_addr; char sin_zero8; ; 字符数组 char bufMAXSIZE;b) 主要函数功能 socket(),connect(),writen(),readn(),close() int socket(int domain, int type, int protocol); 指定期望的通信协议类型。返回值:成功则为非负描述符,出错则为-1。int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); tcp客户用connect函数来建

5、立与tcp服务器的连接。 ssize_t readn(int fd,void *vptr,size_t n); 从一个描述字读n个字节到vptr所指的缓冲区。 ssize_t writen(int fd,const void*vptr,size_t n); 从vptr所指的缓冲区中写n个字节到一个描述字。 int close(int fd); 关闭描述字。2. 迭代服务器详细设计。a) 主要数据结构设计 ipv4套接字地址结构(略) 字符数组 char bufMAXSIZE;b) 主要函数功能 socket(),bind(),listen(),accept(),writen(),readn()

6、,close() int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);bind函数把一个本地协议地址赋予一个套接字。对于网际网协议,协议地址就是32位的ipv4地址或者128位的ipv6地址与16位的tcp或udp端口号的组合。如果一个tcp客户或者服务器未曾调用bind捆绑一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时的端口。 int listen(int sockfd, int backlog); listen函数把一个未连接的套接字转换成一个被动的套接字,指示内核接受指

7、 向该套接字的连接请求。 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); accept函数由tcp服务器调用,用于从已完成连接的队列队头返回下一个已完 成连接。如果已完成连接的队列为空,那么进程被投入睡眠。3. 并发服务器详细设计。a) 主要数据结构设计 ipv4套接字地址结构(略) 字符数组 char bufMAXSIZE;b) 主要函数功能 socket(),bind(),listen(),accept(),witen(),readn(),signal(),close() typedef void Sig

8、func(int); Sigfunc * signal(int signo,Sigfunc * func); 调用函数func处理信号signo。4. 使用单进程和select的TCP服务器详细设计。a) 主要数据结构设计 ipv4套接字地址结构(略) 字符数组 char bufMAXSIZE;b) 主要函数功能 socket(),bind(),listen(),accept(),writen(),readn(),select(), FD_SET(),FD_ISSET(),close() int select(int nfds, fd_set *readfds, fd_set *writefd

9、s, fd_set *exceptfds, struct timeval *timeout); void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set); select()函数允许进程指示内核等待多个事件中的任意一个发生,并仅在一个 或者多个事件发生或经过某指定的时间后才唤醒进程。 FD_CLR()清除描述字fd相应位; FD_ISSET()测试描述字fd相应位; FD_SET()在描述字集合中为

10、fd设置相应位; FD_ZERO()初始化描述字集合。四、实验结果迭代服务器并发服务器使用单进程和select的TCP服务器五、心得体会 未知的事情总显的神秘,以前一直认为在网络中传输数据是很复杂的事情。对“套接字”也只是有个泛泛的概念,知道网络编程要也能够到这个。接触以后,感觉最基本的套接字编程还是挺简单的。但是考虑到各种有可能发生的情况之后,程序就变得复杂了。六、附录:(数据结构、核心代码)/*myfunc.h*/#include#include#include#include#include#include #include #include #include #include #inc

11、lude #include #include #include #include #include #include #include #define SERV_PORT 9996#define MAXSIZE 1024typedef void Sigfunc(int);ssize_t readn(int fd,void *vptr,size_t n) ssize_t nleft; ssize_t nread; char * ptr; ptr = vptr; nleft = n; while(nleft0) if(nread = read(fd,ptr,nleft)0) if(nwritten

12、=write(fd,ptr,nleft)0) printf(child %d terminatedn,pid);fflush(stdout); return;Sigfunc * signal(int signo,Sigfunc * func) struct sigaction act,oact; act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; if(signo = SIGALRM)#ifdef SA_INTERRUPT act.sa_flags|=SA_INTERRUPT;#endif else#ifdef

13、 SA_RESTART act.sa_flags|=SA_RESTART;#endif if(sigaction(signo,&act,&oact)0) return(SIG_ERR); return(oact.sa_handler);/*client.c*/#includemyfunc.hint main(int argc,char *argv) int sockfd; struct sockaddr_in servaddr; if(argc!=2) printf(usage:tcpcli); if(sockfd = socket(AF_INET,SOCK_STREAM,0)0) print

14、f(socket error!); bzero(&servaddr,sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERV_PORT); servaddr.sin_addr.s_addr=inet_addr(argv1); if(connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr)0) printf(link error!%sn,strerror(errno); return 0; char asd5=hello; write

15、n(sockfd,asd,5); char bufMAXSIZE=; int d=0; int file_len = 0; int fds=open(file_in_client.txt,O_CREAT|O_RDWR|O_TRUNC,0666); while( (d=readn(sockfd,buf,MAXSIZE) file_len += writen(fds,buf,d); printf(file_len : %d n,file_len); printf(The file has been received!n); return 0;/*server_1.c*/#include myfun

16、c.hint main(int argc,char *argv) int n,m,b,listenfd,connfd; struct sockaddr_in servaddr; if(n=(listenfd = socket(AF_INET,SOCK_STREAM,0)0) printf(listen error); bzero(&servaddr,sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port=htons(9996)

17、; if(m=(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)0) printf(bind error,%s,strerror(errno); if(b=listen(listenfd,3)0) printf(blisten error); struct sockaddr_in clientAdd; for(;) socklen_t len; len = sizeof(clientAdd); char bufMAXSIZE; connfd = accept(listenfd, (struct sockaddr *)&cli

18、entAdd, &len); char qwe5; readn(connfd,qwe,5); int fid= open(file_in_server.txt,O_RDWR,0666); int s= 0; int len1 = 0; while(s=readn(fid,buf,MAXSIZE) len1 = writen(connfd,buf,s); printf(serone The file has been sent to the client!n); close( connfd); /*server_2.c*/#include myfunc.hint main(int argc,ch

19、ar *argv) pid_t pid; int n,m,b,listenfd,connfd; struct sockaddr_in servaddr; void sig_chid(int); if(n=(listenfd = socket(AF_INET,SOCK_STREAM,0)0) printf(listen error); bzero(&servaddr,sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port=hto

20、ns(SERV_PORT); if(m=(bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)0) printf(bind error,%s,strerror(errno); if(b=listen(listenfd,3)0) printf(listen error); signal(SIGCHLD,sig_chid); struct sockaddr_in clientAdd; for(;) socklen_t len; len = sizeof(clientAdd); char bufMAXSIZE; int s= 0; i

21、f(connfd = accept(listenfd, (struct sockaddr *)&clientAdd, &len)0) if(errno = EINTR) continue; else printf(accept errorn); if(pid=fork()=0) close(listenfd); char qwe5; readn(connfd,qwe,5); int fid= open(file_in_server.txt,O_RDWR,0666); int len1 = 0; while(s=readn(fid,buf,MAXSIZE) len1 = writen(connf

22、d,buf,s); printf(sertwo The file has been sent to the client!n); close(connfd); exit(0); close(connfd); /*server_3.c*/#includemyfunc.hint main(int argc, char *argv) int i,maxfd,maxi, listenfd, connfd,sockfd; int nready, clientFD_SETSIZE; fd_set rset; char bufMAXSIZE; socklen_t clilen; struct sockadd

23、r_in cliaddr, servaddr; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr); listen(listenfd, 3

24、); maxfd = listenfd; maxi = -1; for (i = 0; i FD_SETSIZE; i+) clienti = -1; FD_ZERO(&rset); for ( ; ; ) FD_SET(listenfd, &rset); nready = select(maxfd+1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)=1) clilen = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clil

25、en); for(i =0;iFD_SETSIZE;i+) if(clientimaxfd) maxfd=connfd; if(imaxi) maxi = i; if(-nready=0) continue; for(i=0;i=maxi;i+) if(sockfd=clienti)0) continue; if(FD_ISSET(sockfd,&rset) char qwe10; readn(connfd,qwe,5); int fid= open(file_in_server.txt,O_RDWR,0666); int s= 0; int len1 = 0; while(s=readn(fid,buf,MAXSIZE) len1 = writen(sockfd,buf,s); printf(The file has been sent to the client!n); close(sockfd); FD_CLR(sockfd,&rset); clienti=-1; return 0;

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

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