C++实现的FTP案例代码解析

2016-01-05 19:46:22|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 网络通信|来源:唯设编程网

16. 改变数据传输模式为PASV

int CFTP::ftp_setpasv() 
{ 
	sprintf_s(m_cmd,"PASV
"); 
	int err = ftp_sendcmd(m_cmd,m_resp,sizeof(m_resp)); 
	if(err)
		return -1;
	//得到返回码
	int code = get_state_code(m_resp);
	//227 Entering Passive Mode (127,0,0,1,32,137).
	if(code != 227)
		return -1;	

	m_sockdata = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
	unsigned int v[6]={0}; 
	union { 
		struct sockaddr sa; 
		struct sockaddr_in in; 
	} sin; 
	sscanf_s(m_resp,"%*[^(](%u,%u,%u,%u,%u,%u",&v[2],&v[3],&v[4],&v[5],&v[0],&v[1]); 
	sin.sa.sa_family = AF_INET; 
	sin.sa.sa_data[2] = v[2]; 
	sin.sa.sa_data[3] = v[3]; 
	sin.sa.sa_data[4] = v[4]; 
	sin.sa.sa_data[5] = v[5]; 
	sin.sa.sa_data[0] = v[0]; 
	sin.sa.sa_data[1] = v[1]; 

	int on =1; 
	if (setsockopt(m_sockdata,SOL_SOCKET,SO_REUSEADDR, 
		(const char*) &on,sizeof(on)) == -1) 
	{ 
		perror("setsockopt"); 
		closesocket(m_sockdata); 
		return -1; 
	} 

	struct linger lng = { 0, 0 }; 
	if (setsockopt(m_sockdata,SOL_SOCKET,SO_LINGER, 
		(const char*) &lng,sizeof(lng)) == -1) 
	{ 
		perror("setsockopt"); 
		closesocket(m_sockdata); 
		return -1; 
	} 

	err = connect(m_sockdata,(sockaddr*)&sin,sizeof(sin)); 
	if(err)
		return -1; 
	return 0; 
}

17. 上传目录到FTP服务器

int CFTP::ftp_upload_dir( const char* localpath,const char* remotepath,size_t buf_size)
{
	//进入FTP目录
	int err = ftp_cd(remotepath);
	if(err){
		ftp_mkdir(remotepath);
	}

	WCHAR szFind[MAX_PATH] = {0};	
	//搜索条件
	USES_CONVERSION;
	wcscpy(szFind,A2W(localpath));
	wcscat(szFind,A2W("*.*"));

	WIN32_FIND_DATA FindFileData;

	HANDLE hFind = ::FindFirstFile(szFind,&FindFileData);
	if(INVALID_HANDLE_VALUE == hFind){
		std::cout<<"对应目录不存在!"<<std::endl;
		return -1;
	}

	//查找的文件
	WCHAR szFile[MAX_PATH] = {0};
	do{
		memset(szFile,0,sizeof(szFile));
		wcscpy(szFile,A2W(localpath));
		wcscat(szFile,A2W(""));
		wcscat(szFile,FindFileData.cFileName);
		//目录
		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
			if(FindFileData.cFileName[0] != '.'){
				WCHAR szRemotePath[MAX_PATH] = {0};
				wcscpy(szRemotePath,A2W(remotepath));
				wcscat(szRemotePath,A2W("/"));
				wcscat(szRemotePath,FindFileData.cFileName);
				//上传子目录
				ftp_upload_dir(W2A(szFile),W2A(szRemotePath),buf_size);
			}
		}//文件
		else{
			ftp_upload(W2A(szFile),remotepath,W2A(FindFileData.cFileName),buf_size);
		}
	}while(FindNextFile(hFind,&FindFileData));

	//关闭文件查找句柄
	FindClose(hFind);
	return 0;
}

上传目录主要包括创建目录和上传两部分工作,使用递归的方式,以处理子目录的情况。

发表评论0条 】
网友评论(共?条评论)..
C++实现的FTP案例代码解析