使用C语言socket实现windows pc与ftp服务器通信---socket实现ftp客户端

来源:互联网 发布:ubuntu cinnamon 编辑:程序博客网 时间:2024/05/20 18:43

参考资料1点击打开链接

参考资料2点击打开链接

code

// Client.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <fstream>#include <WinSock2.h>#pragma comment(lib,"WS2_32.lib")using namespace std;#define PORT 21//FTP端口#define IP_ADDR "x.x.x.x"//主机地址int getPortNum(char* buf);bool executeFTPCmd(SOCKET controlSocket, char* buf, int len, int stateCode);int getStateCode(char* buf);int main(){WSADATA dat;SOCKET controlSocket, dataSocket;SOCKADDR_IN serverAddr;int dataPort, ret, stateCode;char buf[100]={0}, sendBuf[1024]={0};//初始化,很重要if (WSAStartup(MAKEWORD(2,2),&dat)!=0)//Windows Sockets Asynchronous启动{cout<<"Init Falied: "<<GetLastError()<<endl;system("pause");return -1;}//创建SocketcontrolSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(controlSocket==INVALID_SOCKET){cout<<"Creating Control Socket Failed: "<<GetLastError()<<endl;system("pause");return -1;}//构建服务器访问参数结构体serverAddr.sin_family=AF_INET;serverAddr.sin_addr.S_un.S_addr=inet_addr(IP_ADDR);//地址serverAddr.sin_port=htons(PORT);//端口memset(serverAddr.sin_zero,0,sizeof(serverAddr.sin_zero));//连接ret=connect(controlSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));if(ret==SOCKET_ERROR){cout<<"Control Socket connecting Failed: "<<GetLastError()<<endl;system("pause");return -1;}cout<<"Control Socket connecting is success."<<endl;//接收返回状态信息recv(controlSocket,buf,100,0);cout<<buf;//220//根据返回信息提取状态码,进行判断if(getStateCode(buf) != 220){cout<<"Error: Control Socket connecting Failed"<<endl;system("pause");exit(-1);}//用户名memset(buf,0,100);sprintf(buf,"USER %s\r\n","xxxx");executeFTPCmd(controlSocket, buf, 100, 331);//331//密码memset(buf,0,100);sprintf(buf,"PASS %s\r\n","xxxx");executeFTPCmd(controlSocket, buf, 100, 230);//230//=======================================//切换到被动模式memset(buf,0,100);sprintf(buf,"PASV\r\n");executeFTPCmd(controlSocket, buf, 100, 227);//227//返回的信息格式为---h1,h2,h3,h4,p1,p2//其中h1,h2,h3,h4为服务器的地址,p1*256+p2为数据端口dataPort=getPortNum(buf);//客户端数据传输socketdataSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);serverAddr.sin_port=htons(dataPort);//更改连接参数中的port值ret=connect(dataSocket,(struct sockaddr*)&serverAddr,sizeof(serverAddr));if(ret==SOCKET_ERROR){cout<<"Data Socket connecting Failed: "<<GetLastError()<<endl;system("pause");return -1;}cout<<"Data Socket connecting is success."<<endl;//更改当前目录memset(buf,0,100);sprintf(buf,"CWD %s\r\n","/ftpxxxx/web/monitor");//250executeFTPCmd(controlSocket, buf, 100, 250);//上传文件memset(buf,0,100);sprintf(buf,"STOR %s\r\n","1.jpg");executeFTPCmd(controlSocket, buf, 100, 125);//125FILE* f=fopen("1.jpg","rb");if(f==NULL){cout<<"The file pointer is NULL!"<<endl;cout<<"Error: "<<__FILE__<<" "<<__LINE__<<endl;exit(-1);}while( !feof(f) ){fread(sendBuf, 1, 1024, f);send(dataSocket, sendBuf, 1024, 0);}fclose(f);//释放资源closesocket(dataSocket);closesocket(controlSocket);WSACleanup();system("pause");return 0;}//从返回信息“227 Entering Passive Mode (182,18,8,37,10,25).”中//获取数据端口int getPortNum(char* buf){int num1=0,num2=0;char* p=buf;int cnt=0;while( 1 ){if(cnt == 4 && (*p) != ','){num1 = 10*num1+(*p)-'0';}if(cnt == 5){num2 = 10*num2+(*p)-'0';}if((*p) == ','){cnt++;}p++;if((*p) == ')'){break;}}cout<<"The data port number is "<<num1*256+num2<<endl;return num1*256+num2;}//通过控制socket执行FTP命令bool executeFTPCmd(SOCKET controlSocket, char* buf, int len, int stateCode){send(controlSocket, buf, len, 0);memset(buf, 0, len);recv(controlSocket, buf, 100, 0);cout<<buf;if(getStateCode(buf) == stateCode){return true;}else{cout<<"The StateCode is Error!"<<endl;return false;}}//从返回信息中获取状态码int getStateCode(char* buf){int num=0;char* p=buf;while(p != NULL){num=10*num+(*p)-'0';p++;if(*p==' '){break;}}return num;}


0 0
原创粉丝点击