文件传输协议的简单设计与实现(c语言.
C语言菜鸟级文件传输

#include <stdio.h>
#include <winsock2.h>
#include <sys/stat.h>
#include <windows.h>
#pragma comment( lib, "WS2_32" )
void jindu(unsigned long i, unsigned long cont);
SOCKET FileSock,S; //声明套接字
struct sockaddr_in Local,Remote; // 配置socket相关信息(ip,port...)
char *ip,temp[2048];
int nLen = sizeof(SOCKADDR_IN);
FILE * fstream = NULL ;//文件指针
int flag = 1;
int nNumRead = 0;
unsigned long filesize = 0;
char ch_filesize[15];
memset(ch_filesize, 0, 15);
if (argc == 2) //当有文件路径参数 才打开文件
char temp[2048], ch_filesize[15];
int nNumRead = 0;
SOCKET FileSock;
struct sockaddr_in Remote;
FILE * fstream = NULL;
if (argc != 1)
{
fstream = fopen( argv[2], "wb" );
C语言网络协议分析与实现

C语言网络协议分析与实现网络协议是计算机网络通信中的重要组成部分,它定义了计算机之间数据交换的规则和方式。
C语言作为一种高效、可移植的编程语言,被广泛应用于网络协议的开发和实现。
本文将从网络协议的概念入手,结合C语言,探讨网络协议的分析与实现方法。
一、网络协议概述网络协议是网络通信中的规范和约定,它包括了数据传输的格式、数据交换的方式以及网络节点之间的通信流程等内容。
常见的网络协议包括TCP/IP协议、HTTP协议、FTP协议等。
在网络协议的分析与实现中,我们重点关注TCP/IP协议。
二、C语言网络协议分析1. TCP/IP协议的分层结构TCP/IP协议是互联网通信的基础协议,它由四个分层组成:物理层、数据链路层、网络层和传输层。
这些分层对于实现网络协议至关重要,通过C语言的网络编程,我们可以对TCP/IP协议进行逐层分析。
2. C语言网络编程基础C语言提供了丰富的网络编程库,如socket库等,可以方便地实现网络协议。
在C语言中,我们可以使用socket函数创建和管理套接字,使用bind函数将套接字与端口绑定,使用listen函数监听连接请求,使用accept函数接受连接等。
3. TCP协议的实现TCP协议是一种面向连接、可靠的传输协议,它通过三次握手建立连接、通过滑动窗口机制实现可靠传输等。
在C语言中,我们可以使用socket函数创建TCP套接字,通过bind、listen和accept函数实现TCP服务器的建立,通过connect函数实现TCP客户端的连接。
4. IP协议的实现IP协议是一种无连接的传输协议,负责将数据包从源主机发送到目的主机。
通过C语言的网络编程,我们可以实现IP协议的分片、重组等功能。
三、C语言网络协议实现1. 套接字编程C语言中的套接字编程是实现网络协议的基础。
我们可以使用socket函数创建套接字,使用bind函数将套接字与端口绑定,使用listen函数监听连接请求,使用accept函数接受连接,使用send和recv 函数进行数据的发送与接收等。
文件传输协议的C语言实现

第ChpNum章文件传输协议的C语言实现1设计目的本设计旨在利用Winsock 简单实现FTP(File Transfer Protocol,文件传输协议)的客户端和服务器端程序。
通过完成此设计,了解Winsock API函数调用方法和一般网络应用程序的编程方法,理解FTP协议,掌握C语言设计FTP协议软件的基本技术,为将来开发其他通信协议软件打下坚实基础。
2 设计准备(1)连入同一局域网的PC,每人一台。
(2)PC装有Windows操作系统、Visual C++ 编译器及开发手册MSDN 。
3关键技术文件传输协议介绍FTP 是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的控制文件的双向传输。
在实现的层面上,FTP又可理解为一个可用于文件传输的客户机/服务器系统,该系统包括客户机端程序和服务器端程序,客户端和服务器端通信规则为FTP协议。
用户通过客户机程序向服务器程序发出命令请求,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。
比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。
客户机程序接收到这个文件,将其存放在用户目录中。
在通信协议的分层模型中,文件传输协议是在TCP(Transmission control Protocol,传输控制协议)之上的一个应用层协议,应用程序之间的通信需要用到传输层提供的字节流透明无误传输服务。
Windows操作系统具有TCP/IP协议栈,应用程序可通过Winsock API函数的调用实现端到端透明数据链接的建立。
Winsock API介绍因特网(Internet)最初是基于Unix的,而Sockets(套接字)是Unix第一个支持TCP/IP 协议栈的网络API,最早于1982年8月随BSD版Unix推出,常被称为Berkeley sockets (伯克利套接字)。
c++文件传输毕业设计

c++文件传输毕业设计摘要:本文描述了一个基于C++的文件传输系统的设计与实现。
该系统具有高效和安全的特点,并且采用了TCP/IP协议进行数据传输。
系统分为客户端和服务器端,客户端可以将本地文件传输到服务器端,服务器端可以接收并保存文件。
在设计过程中,使用了文件流、套接字编程和多线程技术。
通过对系统进行测试和评估,验证了其稳定性和可靠性。
最终结果表明,该文件传输系统能够快速、安全地传输大文件,并且能够满足用户的需求。
1. 引言文件传输是计算机网络中常见的任务之一。
随着互联网的发展和普及,文件传输系统需要具备高效、安全、稳定和可靠等特点。
本文设计了一个基于C++的文件传输系统,该系统通过TCP/IP协议进行数据传输,能够满足用户的需求。
2. 系统设计2.1 系统结构文件传输系统分为客户端和服务器端两部分。
客户端提供了文件选择和传输功能,服务器端则负责接收和保存文件。
2.2 数据传输系统基于TCP/IP协议进行数据传输,使用套接字编程进行通信。
客户端通过套接字将文件内容划分为较小的数据块并发送给服务器端,服务器端再将接收到的数据块组合成完整的文件。
2.3 多线程技术为了提高系统的传输效率,使用了多线程技术。
客户端和服务器端均开启多个线程进行文件传输,从而实现并发传输。
3. 系统实现3.1 客户端实现客户端使用C++编写,通过用户界面提供文件选择的功能。
客户端接收用户选择的文件,并将文件内容划分为数据块进行传输。
客户端还可显示传输进度和传输结果。
3.2 服务器端实现服务器端使用C++编写,通过套接字接收客户端传输的数据块。
服务器端将接收到的数据块组合成完整的文件,并保存到本地磁盘中。
服务器端还可显示传输进度和传输结果。
4. 系统测试与评估为了验证系统的稳定性和可靠性,对系统进行了测试。
通过传输大文件和多个文件,评估系统的传输速度和传输成功率。
测试结果表明,系统能够快速、安全地传输大文件,并且具有良好的稳定性和可靠性。
文件传输C语言实现

////////////////////////////////////#include <netinet/in.h> // for sockaddr_in#include <sys/types.h> // for socket#include <sys/socket.h> // for socket#include <stdio.h> // for printf#include <stdlib.h> // for exit#include <string.h> // for bzero#include <time.h> //for time_t and time#define HELLO_WORLD_SERVER_PORT 7754#define LENGTH_OF_LISTEN_QUEUE 20#define BUFFER_SIZE 1024int main(int argc, char **argv){struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = htons(INADDR_ANY);server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);// time_t now;FILE *stream;int server_socket = socket(AF_INET,SOCK_STREAM,0);if( server_socket < 0){printf("Create Socket Failed!");exit(1);}if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))) {printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT); exit(1);}if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) ){printf("Server Listen Failed!");}while (1)struct sockaddr_in client_addr;socklen_t length = sizeof(client_addr);int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length); if ( new_server_socket < 0){printf("Server Accept Failed!\n");break;}char buffer[BUFFER_SIZE];bzero(buffer, BUFFER_SIZE);strcpy(buffer,"Hello,World! ");strcat(buffer,"\n"); //send(new_server_socket,buffer,BUFFER_SIZE,0);bzero(buffer,BUFFER_SIZE);= recv(new_server_socket,buffer,BUFFER_SIZE,0);if (length < 0){printf("Server Recieve Data Failed!\n");exit(1);}printf("\n%s",buffer);if((stream = fopen("z.mp3","r"))==NULL){printf("The file 'data1' was not opened! \n");exit(1);}elseprintf("The file 'filename' was opened! \n");bzero(buffer,BUFFER_SIZE);int lengsize = 0;while((lengsize = fread(buffer,1,1024,stream)) > 0){printf("lengsize = %d\n",lengsize);if(send(new_server_socket,buffer,lengsize,0)<0){printf("Send File is Failed\n");break;}bzero(buffer, BUFFER_SIZE);}if(fclose(stream))printf("The file 'data' was not closed! \n");exit(1);close(new_server_socket);}close(server_socket);return 0;}//client.c////////////////////////////////////#include <netinet/in.h> // for sockaddr_in#include <sys/types.h> // for socket#include <sys/socket.h> // for socket#include <stdio.h> // for printf#include <stdlib.h> // for exit#include <string.h> // for bzero#include <time.h> //for time_t and time #include <arpa/inet.h>#define HELLO_WORLD_SERVER_PORT 7754#define BUFFER_SIZE 1024int main(int argc, char **argv){if (argc != 2){printf("Usage: ./%s ServerIPAddress\n",argv[0]);exit(1);}//time_t now;FILE *stream;struct sockaddr_in client_addr;bzero(&client_addr,sizeof(client_addr));client_addr.sin_family = AF_INET;client_addr.sin_addr.s_addr = htons(INADDR_ANY);client_addr.sin_port = htons(0);int client_socket = socket(AF_INET,SOCK_STREAM,0);if( client_socket < 0){printf("Create Socket Failed!\n");exit(1);}if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr))){printf("Client Bind Port Failed!\n");exit(1);}struct sockaddr_in server_addr;bzero(&server_addr,sizeof(server_addr));server_addr.sin_family = AF_INET;if(inet_aton(argv[1],&server_addr.sin_addr) == 0){printf("Server IP Address Error!\n");exit(1);}server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);socklen_t server_addr_length = sizeof(server_addr);if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0) {printf("Can Not Connect To %s!\n",argv[1]);exit(1);}char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);int length = recv(client_socket,buffer,BUFFER_SIZE,0);if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]); exit(1);}printf("\n%s\n",buffer);bzero(buffer,BUFFER_SIZE);bzero(buffer,BUFFER_SIZE);strcpy(buffer,"Hello, World! From Client\n");send(client_socket,buffer,BUFFER_SIZE,0);if((stream = fopen("data","w+t"))==NULL){printf("The file 'data' was not opened! \n");}elsebzero(buffer,BUFFER_SIZE);length = 0;while( length = recv(client_socket,buffer,BUFFER_SIZE,0)) {if(length < 0){printf("Recieve Data From Server %s Failed!\n", argv[1]); break;}int write_length = fwrite(buffer,sizeof(char),length,stream); if (write_length<length){printf("File is Write Failed\n");break;}bzero(buffer,BUFFER_SIZE);}printf("Recieve File From Server[%s] Finished\n", argv[1]); fclose(stream);close(client_socket);return 0;}。
cftp协议课程设计

c ftp协议课程设计一、课程目标知识目标:1. 理解FTP协议的基本概念,掌握FTP协议的工作原理;2. 学会使用FTP命令进行文件传输,了解常见的FTP命令及其功能;3. 掌握FTP协议的安全性问题及防范措施。
技能目标:1. 能够独立配置FTP服务器,并进行基本的文件传输操作;2. 能够运用所学知识解决FTP客户端与服务器之间的连接问题;3. 能够分析并解决FTP文件传输过程中出现的问题。
情感态度价值观目标:1. 培养学生主动探索网络协议的兴趣,提高学生的信息素养;2. 增强学生的网络安全意识,使其养成良好的网络行为习惯;3. 培养学生团队协作精神,提高沟通与交流能力。
课程性质:本课程为计算机网络技术与应用课程的一部分,旨在帮助学生掌握FTP协议的基本知识,提高实际操作能力。
学生特点:学生已具备一定的计算机网络基础知识,具有较强的学习能力和动手操作能力。
教学要求:结合课本内容,注重理论与实践相结合,通过实际操作,使学生能够熟练掌握FTP协议的应用。
在教学过程中,关注学生的个体差异,充分调动学生的主观能动性,提高课程教学效果。
将课程目标分解为具体的学习成果,以便进行后续的教学设计和评估。
二、教学内容1. FTP协议基本概念:介绍FTP的定义、作用及其在TCP/IP协议族中的位置;2. FTP工作原理:讲解FTP的连接模式、数据传输方式以及控制通道和数据通道的建立过程;3. FTP命令与操作:详细讲解FTP命令的使用方法,包括登录、下载、上传、删除等操作;4. FTP服务器配置:介绍FTP服务器的安装与配置方法,以及如何设置用户权限和访问控制;5. FTP安全性问题及防范:分析FTP协议的安全隐患,讲解常见的安全防护措施,如SSL/TLS加密、防火墙设置等;6. 实践操作:安排学生进行FTP客户端与服务器之间的文件传输操作,练习使用FTP命令,并针对实际问题进行排查和解决。
教学内容安排与进度:1. 第一课时:FTP协议基本概念与工作原理;2. 第二课时:FTP命令与操作;3. 第三课时:FTP服务器配置与安全性问题;4. 第四课时:实践操作与问题排查。
简单文件传送协议(TFTP)的C语言实现

文件: 据:
WSADTA WSAData; 送文件给客户端f接收文件或数据与之类
WSAStartup(MAKEWORD(2,2),&WSADa— 似1:
ta); Sendto(sock, (char书) &SendBuff,i+4,
创建套接字: MSG_DONTROUTE,(struct sockaddr宰)&Client,
Struct sockaddr_in ServerAddr; {
ServerAddr.sin_family=AF_INET; inti,j;
ServerAddr.sin_addr=inet_addr(MYIp);/ *type=(buff[1】==’13 9"r7:,w7;判断
摘 要:’rFTP(简单文件传送协议)是TCP/TP协议族中用来在客户机与服务器之间进行简单
文件传输的协议。文中给出了在visual C++6.0开发平台上,用C语言按照聊协议在服务器
跟多客户端之间进行文件传榆的实现方法。该方法可以传输超过32MB的文件。
INT8 source[301;p源文件名字宰/ 获得客户端请求操作码:
INT8 dest【50】; 产操作后文件存 locakBuff_opcode=ntobs(Buff.opcode);
2010年3月 Electronic Component&DeviceApplications Mar.2010
{ INT8 bufer【SRV—PACKET_LENGTH】;
SOCK—DGRAMo卑| void gtpGetWRrq (char母type,char
初始化本地主机地址信息: file name口,char buff口)
文件传输协议的设计与实践

客户机上传下载文件显示界面服务器端界面客户机端查看服务器目录客户机端程序清单:#include <Winsock2.h>#include <stdio.h>#include <iostream>using namespace std;//使用名称空间std#pragma comment(lib, "wsock32.lib")//将WinLib.lib库加入到工程中进行编译#define PORT 4523//定义端口号为4523char buf_send[1024];char buf_rec[1024];char IP[20];char filename[20];SOCKET sockClient;SOCKADDR_IN addrServer;//定义表示地址的结构体addrServer,用来表示本地地址//创建套接字DWORD CreateSock(){WSADATA WSAData;//WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息char a[20];memset(a,0,20);//将a中内容初始化为0的ACI码,块长为20if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//加载套接字库和进行套接字库的版本协商对Windows Sockets初始化{printf("sock init fail!\n");//初始化错误return (-1);}if(strncmp(IP,a,20)==0)//比较IP与a{printf("please input the IP of host:");scanf("%s",&IP);}//定义本地地址信息addrServer.sin_family=AF_INET;//地址所属协议簇addrServer.sin_addr.s_addr=inet_addr(IP);//计算机IP地址addrServer.sin_port=htons(PORT);//协议端口号return 1;}DWORD ConnectServer() //连接服务器{sockClient=socket(AF_INET,SOCK_STREAM,0);//创建套接字,SOCK_STREAM为面向连接型if(sockClient==SOCKET_ERROR){printf("sock create fail! \n");WSACleanup();return(-1);}if (connect(sockClient,(struct sockaddr *)&addrServer,sizeof(addrServer))==SOCKET_ERROR)//如果请求建立连接错误{printf("Connect fail \n");memset(IP,0,20);return(-1);}return(1);}void help(){char help[5];cout<<"type help list the command:";cin>>help;cout<<"Command List:"<<endl<<" 'help' ……………………command list "<<endl<<" 'dir' …………………………directory list "<<endl<<" 'cd' ……………………………change current directory"<<endl<<" 'pwd'……………………………list current directory"<<endl<<" 'get'……………………………download files"<<endl<<" 'put'……………………………upload files "<<endl<<" 'quit'……………………………exit !"<<endl;}//list作用?void list(SOCKET sock){int nRead;while(true){nRead=recv(sock,buf_rec,1024,0);//从一个套接口接收数据if(nRead==SOCKET_ERROR){printf("read response error!\n");exit(1);}if(nRead==0)//数据读取结束break;//显示数据buf_rec[nRead]='\0';printf("%s",buf_rec);}}int SendFile(SOCKET datatcps,FILE* file)//SOCKET datatcps定义变量数据连接套接字{printf("sending file data..");for(;;){int r=fread(buf_send,1,1024,file);//从一个流中读数据if(send(datatcps,buf_send,r,0)==SOCKET_ERROR){printf("lost thr connection to client!\n");closesocket(datatcps);return 0;}if(r<1024)//文件传送结束break;}closesocket(datatcps);//关闭接口printf("done\n");return 1;}int ProcessCmd(){int count;char order[10];char param[20];char command[30];FILE *fd;FILE *fd2;command[0]='\0';CreateSock();ConnectServer();cout<<"please input order :"<<endl;memset(order,0,10);//初始化为0memset(param,0,20);//初始化为0memset(command,0,30);//初始化为0memset(buf_rec,0,1024);//初始化为0memset(buf_send,0,1024);//初始化为0cin>>order;strcat(command,order);if(strncmp(order,"get",3)==0||strncmp(order,"put",3)==0||strncmp(order,"cd",2)==0)//有一个输入要求正确{cin>>param;strcat(command," ");strcat(command,param);}cout<<command<<endl;strcpy(buf_send,command);if(send(sockClient,buf_send,sizeof(buf_send),0)<0){cout<<"send data error!"<<endl;closesocket(sockClient);WSACleanup();return 0;}recv(sockClient,buf_rec,1024,0);cout<<buf_rec<<endl;if(strncmp(command,"quit",4)==0){closesocket(sockClient);WSACleanup();return 0;}//quitif(strncmp(buf_rec,"dir",3)==0){list(sockClient);}//dirif(strncmp(order,"cd",2)==0) {}//cdif(strncmp(order,"pwd",3)==0){} //pwdif(strncmp(buf_rec,"get",3)==0){fd=fopen(param,"wb");//使用二进制方式if(fd==NULL){printf("open file %s for weite failed!\n",param);return 0;}while((count=recv(sockClient,buf_rec,1024,0))>0){fwrite(buf_rec,sizeof(char),count,fd);}fclose(fd);}//getif(strncmp(buf_rec,"put",3)==0){strcpy(filename,buf_rec+9);fd2=fopen(filename,"rb");if(fd2){if(!SendFile(sockClient,fd2)){printf("send failed!");return 0;}fclose(fd2);}else//打开文件失败{strcpy(buf_send,"can't open file!\n");if(send(sockClient,buf_send,1024,0))return 0;}}//putclosesocket(sockClient);WSACleanup();return ProcessCmd();}int main(){help();ProcessCmd();return 0;}服务器端程序清单:#include <Winsock2.h>#include <stdio.h>#include <iostream>using namespace std;#pragma comment(lib, "wsock32.lib")#define PORT 4523char buf_send[1024];char buf_rec[1024];SOCKET sockSrv;//socket初始化DWORD CreateSocket(){WSADATA WSAData;//WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//WSAStartup完成winsock的初始化{printf("socket initialize failed!\n");return (-1);}sockSrv=socket(AF_INET,SOCK_STREAM,0);//定义为面向连接的,返回值送给sockSrvif(sockSrv==SOCKET_ERROR){printf("socket create failed ! \n");WSACleanup();//中止Windows Sockets DLL的使用return(-1);}SOCKADDR_IN addrSrv;//TCP/IP使用SOCKADDR_IN 定义地址addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//计算机IP地址addrSrv.sin_port=htons(PORT);//协议端口号addrSrv.sin_family=AF_INET;//地址所属协议簇//绑定端口if(bind(sockSrv,(struct sockaddr FAR *)&addrSrv,sizeof(addrSrv))==SOCKET_ERROR){printf("Bind Error");return(-1);}return (1);}int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)//used to send response to client{char filerecord[MAX_PATH+32];FILETIME ft;FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);//将一个FILETIME结构转换成本地时间SYSTEMTIME lastwtime;//系统时间FileTimeToSystemTime(&ft,&lastwtime);//根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"<DIR>":" ";sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20s\n",lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd->nFileSizeLow,pfd->cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR){printf("Error occurs when sending file list!\n");return 0;}return 1;}//发送主机文件目录int SendFileList(SOCKET datatcps){HANDLE hff;WIN32_FIND_DATA fd; //获取和更改文件属性//搜索文件hff=FindFirstFile("*",&fd);if(hff==INVALID_HANDLE_VALUE)//无效的返回值{const char *errstr="can't list files!\n";printf("list file error!\n");if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR){printf("error occurs when sending file list!\n");}closesocket(datatcps);return 0;}BOOL fMoreFiles=TRUE;while(fMoreFiles){//发送此项文件信息if(!SendFileRecord(datatcps,&fd)){closesocket(datatcps);return 0;}//搜索下一个文件fMoreFiles=FindNextFile(hff,&fd);}closesocket(datatcps);return 1;}//发送数据int SendFile(SOCKET datatcps,FILE* file)//发送文件{printf("sending file data..");for(;;)//从文件中循环读取数据并发送客户端{int r=fread(buf_send,1,1024,file);if(send(datatcps,buf_send,r,0)==SOCKET_ERROR){printf("lost the connection to client!\n");closesocket(datatcps);return 0;}if(r<1024)//文件传送结束break;}closesocket(datatcps);printf("done\n");return 1;}DWORD ProcessCmd(){if(listen(sockSrv,5)<0)//监听信号{printf("Listen error!");return(-1);}printf("Listening for the request……\n");SOCKADDR_IN addrclient;//定义用于返回客户机端地址的结构int len=(sizeof(SOCKADDR_IN));while(1){SOCKET sockconn=accept(sockSrv,(SOCKADDR*)&addrclient,&len);//接受请求,产生新的套接字if(sockconn==INVALID_SOCKET)continue;else printf("connecting from client\n");while(true){char filename[20];memset(buf_rec,0,1024);memset(buf_send,0,1024);if(recv(sockconn,buf_rec,1024,0)<=0){break;}cout<<endl<<"the command is:"<<buf_rec<<endl;if(strncmp(buf_rec,"dir",3)!=0&&strncmp(buf_rec,"get",3)!=0&&strncmp(buf_rec,"put",3)!= 0&&strncmp(buf_rec,"pwd",3)!=0&&strncmp(buf_rec,"cd",2)!=0)continue;//有一个请求正确执行下面语句if(strncmp(buf_rec,"dir",3)==0){strcpy(buf_send,"dir-ing\n");send(sockconn,buf_send,1024,0);SendFileList(sockconn);//发送当前所有文件名}//dirif(strncmp(buf_rec,"cd",2)==0){strcpy(filename,buf_rec+3);strcpy(buf_send,"cd-ing\n");send(sockconn,buf_send,1024,0);//发送修改目录SetCurrentDirectory(filename);continue;}//cdif(strncmp(buf_rec,"pwd",3)==0){//获取当前目录,并放至回复报文中if(!GetCurrentDirectory(1024,buf_send))strcpy(buf_send,"pwd--can't get the current directory!\n");if(!send(sockconn,buf_send,1024,0))printf("send error!");continue;}//pwdif (strncmp(buf_rec,"get",3)==0){strcpy(filename,buf_rec+4);printf(filename);FILE *file;//处理下载文件请求file=fopen(filename,"rb");//打开下载的文件if(file){sprintf(buf_send,"get file %s\n",filename);if(!send(sockconn,buf_send,1024,0)){fclose(file);return 0;}else{//创建额外数据连接传送数据if(!SendFile(sockconn,file))return 0;fclose(file);}}//fileelse//打开文件失败{strcpy(buf_send,"can't open file!\n");if(send(sockconn,buf_send,1024,0))return 0;} //lost}//get 处理客户端的下载请求if(strncmp(buf_rec,"put",3)==0){FILE *fd;int count;strcpy(filename,buf_rec+4);fd=fopen(filename,"wb");if(fd==NULL){printf("open file %s for weite failed!\n",filename);continue;}sprintf(buf_send,"put file %s",filename);if(!send(sockconn,buf_send,1024,0)){ fclose(fd);return 0;}while((count=recv(sockconn,buf_rec,1024,0))>0)fwrite(buf_rec,sizeof(char),count,fd);fclose(fd);continue;}//put 处理客户端的上传请求}//for// closesocket(sockconn);}}int main(){CreateSocket();ProcessCmd();return(1);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件传输协议的简单设计与实现(c语言,VC6.0)使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。
一个连接就建立起来了。
Server端和Client端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:(1)创建Socket;(2)打开连接到Socket的输入/出流;(3)按照一定的协议对Socket进行读/写操作;(4)关闭Socket.第三步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同。
/****************client.c****************/#include<winsock2.h>#include<stdio.h>#include<stdlib.h>#pragma comment(lib,"ws2_32.lib")#define DEFAULT_PORT 2302#define DEFAULT_BUFFER 2048#define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system" char szServerip[128], // Server to connect toszMessage[1024]; // Message to send to severint iPort = DEFAULT_PORT; // Port on server to connect to//DWORD dwCount = DEFAULT_COUNT; // Number of times to send messageBOOL bSendOnly = FALSE; // Send data only; don't receiveint dirfun();int getfun();int putfun();int pwdfun();int cdfun();int mdfun();int delfun();int usafun();void usage(){printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]\n\n");printf(" -p:x Remote port to send to\n");printf(" -s:IP Server's IP address or hostname\n");printf(" -n:x Number of times to send message\n");printf(" -o Send messages only; don't receive\n");ExitProcess(1);}void ValidateArgs(int argc, char**argv){int i;for(i = 1; i < argc; i++){if((argv[i][0] == '-') || (argv[i][0] == '/')){switch(tolower(argv[i][1])){case'p': // Remote portif(strlen(argv[i]) > 3)iPort = atoi(&argv[i][3]);break;case's': // Serverif(strlen(argv[i]) > 3)strcpy(szServerip, &argv[i][3]);break;case'n': // Number of times to send message if(strlen(argv[i]) > 3)//dwCount = atol(&argv[i][3]);break;case'o': // Only send message; don't receivebSendOnly = TRUE;break;default:usage();break;}}}}int main(int argc, char**argv){WSADATA wsd;SOCKET sClient;char szBuffer[DEFAULT_BUFFER];int ret;//unsigned int i;//int j;struct sockaddr_in server;struct hostent *host = NULL;char choice[5],choice2[40];// Parse the command line and load Winsock//argv[1]="-s:127.0.0.1";strcpy(szServerip, &argv[1][3]);//ValidateArgs(argc, argv);if(WSAStartup(MAKEWORD(2,2), &wsd) != 0){printf("Failed to load Winsock library!\n");return1;}//strcpy(szMessage, DEFAULT_MESSAGE);//// Create the socket, and attempt to connect to the server //sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sClient == INVALID_SOCKET){printf("socket() failed: %d\n", WSAGetLastError());return1;}server.sin_family = AF_INET;server.sin_port = htons(iPort);printf("server.sin_port=%u\n",server.sin_port);server.sin_addr.s_addr = inet_addr(szServerip);//// If the supplied server address wasn't in the form// "c.ddd" it's a hostname, so try to resolve it //if(server.sin_addr.s_addr == INADDR_NONE){host = gethostbyname(szServerip);if(host == NULL){printf("Unable to resolve server: %s\n", szServerip);return1;}CopyMemory(&server.sin_addr, host->h_addr_list[0], host->h_length);}if(connect(sClient, (struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR){printf("connect() failed: %d\n", WSAGetLastError());return1;}//显示接通信息//////for(j=0;j<2;j++)//{ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if(ret == 0) // Graceful closereturn0;else if(ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(ret<15){ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if(ret == 0) // Graceful closereturn0;else if(ret == SOCKET_ERROR){//printf("recv() failed: %d\n", WSAGetLastError());return0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);}//printf("DEFAULT_BUFFER=%d\n",DEFAULT_BUFFER);}while(1){puts("------------------------------------------");printf("ftp> ");scanf("%s", choice);if(strncmp(choice,"dir",3)==0||strncmp(choice,"DIR",2)==0){dirfun(sClient);continue;}else if(strncmp(choice,"pwd",3)==0||strncmp(choice,"PWD",3)==0) {pwdfun(sClient);continue;}else if(strncmp(choice,"?",1)==0){usafun(sClient);continue;}else if(strncmp(choice,"quit",4)==0||strncmp(choice,"QUIT",2)==0) {break;}scanf("%s", choice2);if(strncmp(choice,"get",3)==0||strncmp(choice,"GET",3)==0){getfun(sClient,choice2);continue;}else if(strncmp(choice,"put",3)==0||strncmp(choice,"PUT",3)==0) {putfun(sClient,choice2);continue;}else if(strncmp(choice,"cd",2)==0||strncmp(choice,"CD",2)==0) {cdfun(sClient,choice2);continue;}else if(strncmp(choice,"md",2)==0||strncmp(choice,"MD",2)==0) {mdfun(sClient,choice2);continue;}else if(strncmp(choice,"del",3)==0||strncmp(choice,"DEL",3)==0){delfun(sClient,choice2);continue;}//elseputs("输入错误,请重新输入");fflush(stdin);fflush(stdin);printf("\n");printf("\n");}closesocket(sClient);WSACleanup();return0;}int dirfun(SOCKET sClient){int ret;char*MSG="dir$";char szBuffer[80];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if(ret == 0)return1;else if(ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return1;}//printf("Send %d bytes\n", ret);//printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示//ret = recv(sClient, szBuffer, 80, 0);//printf("%s",szBuffer);ret = recv(sClient, szBuffer, 80, 0);if(ret == 0) // Graceful closereturn1;else if(ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return1;}szBuffer[ret] = '\0';if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}printf("%s",szBuffer);if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0) {break;}}return0;}int getfun(SOCKET sClient,char filename[40]){int ret;FILE *fpre;char szBuffer[80];szMessage[0]='\0';strcat(szMessage, "get$");//strcat(szMessage, "\\");strcat(szMessage,filename);//printf("MSG[4]=%c\n",szMessage[4]);//szMessage[0]='g';szMessage[1]='e';szMessage[2]='t';////szMessage[4]='m';szMessage[5]='e';szMessage[6]='.';szMessage[7]='t';////szMessage[8]='x';szMessage[9]='t';szMessage[10]='\0';ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if(ret == 0)return1;else if(ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return1;}printf("Send %d bytes\n", ret);ret = recv(sClient, szBuffer, 80, 0);/*if (ret == 0) // Graceful closebreak;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());break;}*/szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(strncmp( szBuffer,"125 Transfering...",strlen("125 Transfering...") )==0) {if( (fpre=fopen(filename,"w")) == NULL ){printf("open errer");return1;}printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if(ret == 0) // Graceful closereturn1;else if(ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return1;}szBuffer[ret] = '\0';//printf("%s",szBuffer);if(strncmp(szBuffer,"226 Transfer",strlen("226 Transfer"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}fprintf(fpre,"%s",szBuffer);}printf("%s\n",szBuffer);fclose(fpre);}return0;}int putfun(SOCKET sClient,char filename[40]){int ret;//int i;FILE *fpse;//char *filename;//char *MSG="get\0me.txt";char szBuffer[80],temp_buffer[80];//sprintf(szMessage, "get\0","te.txt\0");szMessage[0]='\0';strcat(szMessage, "put$");strcat(szMessage,filename);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if(ret == 0)return0;else if(ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return1;}//printf("Send %d bytes\n", ret);//filename="me.txt";printf("filename=%s\n",filename);if( (fpse=fopen(filename,"r")) == NULL ){printf("open errer");return1;}else{printf("The file %s found,ready to transfer.\n",filename);//i=0;while(fgets(temp_buffer,80,fpse)!=NULL){sprintf(szBuffer,"%s",temp_buffer);send(sClient, szBuffer, 80, 0);}}sprintf(szBuffer, "226 Transfer completed... \r\n");ret = send(sClient, szBuffer, strlen(szBuffer), 0);fclose(fpse);return0;}int pwdfun(SOCKET sClient){int ret;char*MSG="pwd$";char szBuffer[160];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if(ret == 0)return1;else if(ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return1;}printf("Send %d bytes\n", ret);printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 160, 0);if(ret == 0) // Graceful closereturn1;else if(ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return1;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0) {break;}}return0;}int cdfun(SOCKET sClient,char pathname[40]){int ret;szMessage[0]='\0';strcat(szMessage, "cd$");strcat(szMessage,pathname);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if(ret == 0)return1;else if(ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return1;}printf("Send %d bytes\n", ret);return0;}int mdfun(SOCKET sClient,char pathname[20]){int ret;char szBuffer[160];//char *MSG="md$";szMessage[0]='\0';strcat(szMessage, "md$");//strcat(szMessage, "\\");strcat(szMessage,pathname);//strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if(ret == 0)return1;else if(ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return1;}printf("Send %d bytes\n", ret);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if(ret == 0) // Graceful closereturn1;else if(ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return1;}szBuffer[ret] = '\0';printf("%s",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}}return0;}int delfun(SOCKET sClient,char name[20]){int ret;char szBuffer[80];szMessage[0]='\0';strcat(szMessage, "del$");strcat(szMessage,name);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if(ret == 0)return1;else if(ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return1;}printf("Send %d bytes\n", ret);while(!bSendOnly){ret = recv(sClient, szBuffer, 80, 0);if(ret == 0) // Graceful closereturn1;else if(ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return1;}szBuffer[ret] = '\0';if(strncmp(szBuffer,"del ok",strlen("del ok"))==0){printf("del %s ok\n",name);break;}printf("%s",szBuffer);if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0) {break;}}return0;}int usafun(){puts("------------------------------------------");puts("get:取远方的一个文件");puts("put:传给远方一个文件");puts("pwd:显示远主当前目录");puts("dir:列出远方当前目录");puts("md :在远方新建文件夹");puts("cd :改变远方当前目录");puts("?:显示你提供的命令");puts("quit :退出返回");return0;}//int quit()/****************server.c****************/#include <stdio.h>#include <winsock.h>#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")WSADATA wsd;char sbuffer[80],rbuffer[80];//send and receive buffers int n,bytes;//countersSOCKET newsocket,ns_data;struct sockaddr_in remoteaddr; //remoteaddr_data;int port_connect=0;//port connect flagchar path[80]="";char order[100]="";//SOCKET s_data_port;int sy_error=1; // use for indicate Syntax error//server functionsint sdirfun(SOCKET newsocket);int sgetfun(SOCKET newsocket);int sputfun(SOCKET newsocket);int spwdfun(SOCKET newsocket);int scdfun(SOCKET newsocket);int smdfun(SOCKET newsocket);int sdelfun(SOCKET newsocket);void HandleError(char *func);//server functions end//MAINint main(int argc, char *argv[]){struct sockaddr_in localaddr;//local address structureSOCKET s;//s_data;//welcome socket and welcome socket for data connection,and port connection for connect to clientint addr_inlen;//address lenght variableif (WSAStartup(MAKEWORD(2,2), &wsd) != 0){WSACleanup();printf("WSAStartup failed\n");}memset(&localaddr,0,sizeof(localaddr));//clear localaddrs = socket(PF_INET, SOCK_STREAM, 0);if (s <0){printf("socket failed\n");}localaddr.sin_family = AF_INET;if(argc == 2)localaddr.sin_port = htons((u_short)atoi(argv[1]));elselocaladdr.sin_port = htons(2302);localaddr.sin_addr.s_addr = INADDR_ANY;if (bind(s,(struct sockaddr *)(&localaddr),sizeof(localaddr)) < 0){printf("Bind failed!\n");}//INFINITE LOOPwhile (1){ // while loop 1//LISTENlisten(s,3);addr_inlen = sizeof(remoteaddr);//ACCEPT main connection (control connection)newsocket = accept(s,(struct sockaddr *)(&remoteaddr),&addr_inlen);if (newsocket == INVALID_SOCKET) break;printf("connected to %s at port %d \n",inet_ntoa(remoteaddr.sin_addr),nto hs(localaddr.sin_port));//Respond with welcome message, FTP client requires thosesprintf(sbuffer,"200 Welcome \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer,"530 Log in \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//INFINITE LOOPwhile (1) // while loop 2{n = 0;sy_error=1;while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[n], 1, 0);printf("rbuffer[%d]=%c\n",n,rbuffer[n]);if ((bytes < 0) || (bytes == 0))break;if (rbuffer[n] == '$'){rbuffer[n] = '\0';break;}if (rbuffer[n] != '\r')n++;} // end of while loop 3if ((bytes < 0) || (bytes == 0))break;printf("#The Server receives:# '%s' from client \n", rbuffer);//THE FTP COMMANDS HERE//LISTif(strncmp(rbuffer,"dir",3)==0){sdirfun(newsocket);}//当前目录if(strncmp(rbuffer,"pwd",3)==0){spwdfun(newsocket);}//改变目录if (strncmp(rbuffer,"cd",2)==0){scdfun(newsocket);}//GETif (strncmp(rbuffer,"get",3)==0){sgetfun(newsocket);}//PUTif (strncmp(rbuffer,"put",3)==0){sputfun(newsocket);}//MDif (strncmp(rbuffer,"md",2)==0){smdfun(newsocket);}if (strncmp(rbuffer,"del",3)==0){sdelfun(newsocket);}//QUITif (strncmp(rbuffer,"quit",4)==0){printf("quit \n");sprintf(sbuffer, "221 Bye bye ... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sy_error=0;break;}//Syntax errorif (sy_error==1){printf("command unrecognized, non-implemented!\n");sprintf(sbuffer, "500 Syntax error. \n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);}} // end of while loop 2//CLOSE CONTROL SOCKETclosesocket(newsocket);printf("disconnected from %s at port %d, close control socket.\n",inet_ntoa(re moteaddr.sin_addr),ntohs(localaddr.sin_port));} // end of while loop 1//CLOSE WELCOME SOCKETclosesocket(s);printf("Welcome sockets close");return 0;}int sdirfun(SOCKET newsocket){char temp_buffer[80];printf("Equivalent to dir \n");order[0]='\0';strcat(order,"dir ");strcat(order,path);strcat(order," >tmp.txt");system(order);FILE *fin;fin=fopen("tmp.txt","r");sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);while (fgets(temp_buffer,80,fin)!=NULL){sprintf(sbuffer,"%s",temp_buffer); //if (port_connect==0)send(newsocket, sbuffer, strlen(sbuffer), 0);}fclose(fin);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);system("del tmp.txt");//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sgetfun(SOCKET newsocket){printf("RETR mode.\r\n");int i=4,k=0;char filename[20],temp_buffer[80];// identify the filename from rbuffer after the word "RETR "while (1) // while loop 4{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of while loop 4order[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);char *p_filename=order;FILE *fp;if( (fp=fopen(p_filename,"r")) == NULL ){sprintf(sbuffer, "Sorry, cannot open %s. Please try again.\r\n",filenam e);bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);return 1;}else{printf("The file %s found,ready to transfer.\n",filename);sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);while (fgets(temp_buffer,80,fp)!=NULL){sprintf(sbuffer,"%s",temp_buffer); //if (port_connect==0)send(newsocket, sbuffer, strlen(sbuffer), 0);}//end of whilefclose(fp);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);}sy_error=0;return 0;}int sputfun(SOCKET newsocket){printf("Equivalent to put. \n");int i=4,k=0;char filename[20];// identify the filename from rbuffer after the word "RETR " while (1){bytes = recv(newsocket, &rbuffer[i], 1, 0);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of whileorder[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);printf("filename=%s,",order);char *p_filename=order;FILE *fpse;if( (fpse=fopen(order,"w")) == NULL ){printf("open errer");return 1;}else{printf("The file %s found,ready to transfer.\n",filename);while(1){//读取流并显示int ret;ret = recv(newsocket, rbuffer, 80, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 0;}if(strncmp(rbuffer,"226 Transfer",strlen("226 Transfer"))==0){break;}fprintf(fpse,"%s",rbuffer);}printf("RBUFFER=%s",rbuffer);fclose(fpse);}sy_error=0;return 0;}int spwdfun(SOCKET newsocket){printf("Equivalent to pwd \n");//order[0]='\0';//strcat(order,"dir ");//strcat(order,path);//strcat(order,);system("cd >tmp.txt");FILE *fin;fin=fopen("tmp.txt","r+");sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);char temp_buffer[160];while (fgets(temp_buffer,80,fin)!=NULL){temp_buffer[strlen(temp_buffer)-1]='\0';printf("temp_buffer=%s",temp_buffer);///////////////////////////////目录判定if(path[0]!='\0')sprintf(sbuffer,"%s\\%s",temp_buffer,path);elsesprintf(sbuffer,"%s",temp_buffer);///////////////////////////////if (port_connect==0)//send(ns_data, sbuffer, strlen(sbuffer), 0);send(newsocket, sbuffer, strlen(sbuffer), 0);}fclose(fin);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);system("del tmp.txt");//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int scdfun(SOCKET newsocket){int i=3,k=0;char name[20],name2[20];int j,count=0;//path overfollowint pathlen;printf("Equivalent to cd \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];name2[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';name2[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileif(path[0]!='\0')strcat(path,"\\");strcat(path,name);if(strncmp(name2,"..",2)==0){pathlen=strlen(path);for(j=pathlen-1;j>=0;j--){if(path[j]=='\\'){path[j]='\0';count++;}if(count==2){//path[j]='\0';break;}}printf("%d=\n",j);path[j+1]='\0';}printf("path=%s",path);sy_error=0;return 0;}int smdfun(SOCKET newsocket){char name[20];int i=3,k=0;printf("Equivalent to md \n");while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}}order[0]='\0';strcat(order,"md ");strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,name);system(order);//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){//closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sdelfun(SOCKET newsocket){int i=3,k=0;char name[20];printf("Equivalent to del \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileorder[0]='\0';strcat(order,"rd ");strcat(order,path);if(path[0]!='\0')strcat(path,"\\");strcat(order,name);system(order);sprintf(sbuffer,"del ok... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);if (bytes == SOCKET_ERROR){HandleError("recv()");sy_error=1;return 1;}sy_error=0;return 0;}void HandleError(char *func){char info[65]= {0};_snprintf(info, 64, "%s: %d\n", func, WSAGetLastError());printf(info);}。