1、TP(传输控制协议)和UDP(用户数据报协议)。P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,UP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。 TCP/IP协议与Winsock网络编程接口Winsock规范不是一种网络协议,而是一套开放的、支持多种协议的Windows写的网络编程接口。Wins
2、ock可以访问很多种网络协议,可以把它当作一种协议的封装。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用协议的功能 Winsock API的使用下面给出了使用Winsock进行编程时涉及的主要函数:WSAStartup函数、WSACleanup函数、socket函数、closesocket函数、send函数、recv函数、bind函数、listen函数、accept函数、connect函数 4 课程设计过程使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Serv
3、er端发出Coonnect(连接)请求,Server端向Client端发回Accept(接受)信息,一个连接就建立起来了。Server端和Client端都可以通过send,put,dir等方法与对方通信.1. 客户端指定要索取服务器端的哪个文件夹的内容,即在客户端将服务器端某个文件夹的路径发送给服务器端。2.服务器端解析这个字符串,遍历整个文件夹,将文件夹中的文件逐个传回到客户端。3.客户端逐个接收服务器端传来的文件,安放到指定的目录下。1.服务器端调用socket的accept()方法,等待客户端联接。2.客户端发送需要从服务端获得的文件夹路径给服务器端。3.服务器端根据客户端发来的路径遍历
4、整个路径下的文件及文件夹,并将需要传送到文件记录全路径记录到一个String类型的数组中,并将文件的个数发送给客户端。4.客户端接收服务器端发来的文件个数,并向服务器端发送关闭联接请求,并关闭客户端连接。5.服务器端收取关闭连接请求,将socket关闭,进入传输文件循环中。6.服务器端调用socket的accept()方法,等待客户端联接。7.客户端根据刚才取得的要传输的文件数,进行循环获取文件,记得每次取完文件要关闭socket连接,这样就不会将多个文件写入到同一个文件中。4.3系统的基本功能1.get:取远方的一个文件2.put:传给远方一个文件3.pwd:显示远主当前目录4.dir:列出
5、远方当前目录5.cd :改变远方当前目录6.? :显示你提供的命令7.quit :退出返回的主要工作流程否开始输入连接的主机号dircd?pwdgetputquit选择显示总菜单显示远方当前目录显示结果继续是结束图4-1客户端的主要工作流程4.5主要功能模块如下:(1)帮助显示客户端主操作菜单void help() cout 欢迎进入迷你FTP帮助菜单 endl * * * * * * * * * * * * * * * * * * * * * *1.get.下载(接受)文件* *get的用法: get 文件名 * *2.put.上传(发送)文件* endl *put的用法:put 文件名 *
6、 *3.pwd.显示当前文件夹的绝对路径* *4.dir.显示远方当前目录的文件* *5.cd.改变远方当前目录和路径* *cd的用法(进入下级目录): cd 路径名 * *cd的用法(进入上级目录): cd . * *6.?或者help.进入帮助菜单* *7.quit.退出FTP* endl;(2)各种处理命令代码void list(SOCKET sockfd) int nRead; while(true) nRead=recv(sockclient,rbuff,1024,0);/recv函数通过sockclient套接口接受数据存入rbuff缓/冲区,返回接受到的字节数 if(nRead=
7、SOCKET_ERROR) printf(read response error!n); exit(1); if(nRead=0)/数据读取结束 break; /显示数据 rbuffnRead=0;%s,rbuff);int SendFile(SOCKET datatcps,FILE* file)/发送文件,处理put命令 sending file data. for(;) /从文件中循环读取数据并发送客户端 int r=fread(sbuff,1,1024,file);/fread函数从file文件读取1个1024长度的数据到sbuff,返/回成功读取的元素个数 if(send(datatc
8、ps,sbuff,r,0)=SOCKET_ERROR)lost the connection to client! closesocket(datatcps); return 0; if(r1024)/文件传送结束donen return 1;DWORD StartSock()/启动winsockWSADATA WSAData;char a20;memset(a,0,20);if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/加载winsock版本printf(sock init fail!return (-1);if(strncmp(InputIP,a,20)
9、=0)printf(请输入连接的主机IP:scanf(,&InputIP);/设置地址结构ServerAddr.sin_family=AF_INET;/AF_INET表示使用IP地址族ServerAddr.sin_addr.s_addr=inet_addr(InputIP);/指定服务器IPServerAddr.sin_port=htons(RECV_PORT);/设置端口号return(1);/创建套接字DWORD CreateSocket() sockclient=socket(AF_INET,SOCK_STREAM,0);/当socket函数成功调用时返回一个新的SOCKET(Socke
10、t Descriptor) if(sockclient=SOCKET_ERROR) printf(sockclient create fail! n WSACleanup(); return(-1); return(1);DWORD CallServer() /发送连接请求 CreateSocket(); if (connect(sockclient,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr)=SOCKET_ERROR)/connect函数创建与指定外部端口的/连接 printf(Connect fail n memset(InputIP
11、,0,20); return(-1);DWORD TCPSend(char data)/发送命令 int length; length=send(sockclient,data,strlen(data),0);/send函数通过sockclient接口发送data里面的/数据,发送成功返回发送的字节数 if(length0) fwrite(rbuff,sizeof(rbuff),count,fd);/把count个数据长度为size0f()的数据从/rbuff输入到fd指向的目标文件 fclose(fd);/关闭文件 /get strcpy(filename,rbuff+9); fd2=fop
12、en(filename,rb/rb读写打开一个二进制文件,只允许读写数据。if(fd2) if(!SendFile(sockclient,fd2) send failed! return 0; fclose(fd2);/关闭文件else/打开文件失败 strcpy(sbuff,cant open file! if(send(sockclient,sbuff,1024,0) /putdir list(sockclient);/列出接受到的列表内容/dirpwd/列出接受到的内容-绝对路径,2)=0)/cdclosesocket(sockclient);/关闭连接WSACleanup();/释放W
13、insock return main();/main4.4程序实现部分如下:客户端:#include Winsock.hwindows.hstdio.htime.h#include #define RECV_PORT 3312#define SEND_PORT 4302#pragma comment(lib, wsock32.libSOCKET sockclient;char filename20;/文件名sockaddr_in ServerAddr;/服务器地址char rbuff1024;/接收缓冲区char sbuff1024;/发送缓冲区char InputIP20;/存储输入的服务器IP/处理help命令/处理dir命令 if (connect(sockclient,(struct sockaddr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1