2016-01-05 19:46:22|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 网络通信|来源:唯设编程网
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; }
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; }
上传目录主要包括创建目录和上传两部分工作,使用递归的方式,以处理子目录的情况。