ofstream outPutFile(fileName,ios::out|ios::app); memset(buffer,NULL,4096); int r = recv(socketData,buffer,4096,0); outPutFile.write(buffer,r); if (r < 0) { cout<<\ outPutFile.close(); closesocket(socketData); return 0; } if (r == 0) { break; closesocket(socketData); outPutFile.close(); } } return 1; }
/***************************************** 发送数据从filename中读取数据
*****************************************/ int sendData(char* fileName) { memset(buffer,NULL,4096); ifstream inPutFile(fileName,ios::in|ios::app); inPutFile.read(buffer,sizeof(buffer)); cout< ftpClient.cpp #pragma comment(lib,\#include 31 / 37 #include #define MENU \To The FTP Server,Please Input The Command And Enter!Such as: LIST,CWD,RETR,DELE,RMD,MKD\/* DELE TYPE 被动模式:被动模式是发送被动连接模式命令,服务器由应答码返回可用的ip与端口信息, 通过对应答码的分析找到端口号,用客户端连接正在监听的服务器端口 **/ int main() { char* Direct = new char[256]; memset(Direct,NULL,256); Direct[1] = '/'; int returnNum; char ip[15]; int port; char test; char *userName = new char[50]; memset(userName,NULL,50); memcpy(userName,\ char PWD[50]; char temp[512]; char Command[4]; char Parameter[256]; cout<<\ cin>>ip; cout<<\ cin>>test; if(test=='Y'||test=='y') { cout<<\ cin>>temp; port = (temp[0] - '0')*10+(temp[1] - '0'); 32 / 37 memset(temp,NULL,2); } else if (test=='N'||test=='n') port = 21; else cout<<\ /************************************ 用户登录模块 ************************************/ ftpClient* client = new ftpClient(ip,port); cout<<\cin>>test; if(test=='Y'||test=='y') { cout<<\ cin>>userName; } else if (test=='N'||test=='n') cout<<\else cout<<\client->setCommand(\cout< returnNum = client->receiveCommand(); if(returnNum == 331) { cout<<\ cin>>PWD; client->setCommand(\ client->sendCommand(); returnNum = client->receiveCommand(); if(returnNum == 230) { while(1) { cout<
33 / 37
************************************/ //PASV方式传输 client->setCommand(\ client->sendCommand(); client->receiveCommand(); //分析应答码取端口号 client->getPort();
//设置传输类型初始化数据套接字 client->setCommand(\ client->sendCommand(); client->receiveCommand(); client->interlizeDataSocket(); client->setCommand(\ cout<
带有数据传输的文件需要建立数据套接字来传输,
34 / 37
建立数据套接字的方式有两种,主动模式,被动模式。 ************************************/ else if(strcmp(Command,\ { char* filename = new char[512]; memset(filename,NULL,512); //PASV方式传输 client->setCommand(\ client->sendCommand(); client->receiveCommand(); //分析应答码取端口号 client->getPort(); //设置传输类型初始化数据套接字 client->setCommand(\ client->sendCommand(); client->receiveCommand(); client->interlizeDataSocket(); cout<<\ cin>>filename; memset(temp,NULL,512); //格式化路径信息Direct memcpy(temp,Direct,strlen(Direct)); memcpy(temp+strlen(Direct),\ memcpy(temp+strlen(Direct)+strlen(\ /************************************ 格式化命令retr
************************************/ client->setCommand(\ client->sendCommand(); client->receiveCommand(); //接收数据信息和应答信息 client->receiveData(filename); client->receiveCommand(); //清理内存 delete filename; } else if(strcmp(Command,\ { char* filename = new char[512]; memset(filename,NULL,512); /************************************ 上载模块
35 / 37