#include "SH_Datatrans.hpp" #include "dirent.h" #include DataTrans *pDataTrans = DataTrans::instance(); struct DowloadFile { const char *filename; FILE *stream; }; DataTrans::DataTrans(): m_bDebug(false) { } DataTrans::~DataTrans() { } static int OnDebug(CURL *, curl_infotype itype, char * pData, size_t size, void *) { if(itype == CURLINFO_TEXT) { //printf("[TEXT]%s\n", pData); } else if(itype == CURLINFO_HEADER_IN) { print_info("[HEADER_IN]%s\n", pData); } else if(itype == CURLINFO_HEADER_OUT) { print_info("[HEADER_OUT]%s\n", pData); } else if(itype == CURLINFO_DATA_IN) { print_info("[DATA_IN]%s\n", pData); } else if(itype == CURLINFO_DATA_OUT) { print_info("[DATA_OUT]%s\n", pData); } return 0; } static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid) { std::string* str = dynamic_cast((std::string *)lpVoid); if( NULL == str || NULL == buffer ) { return -1; } char* pData = (char*)buffer; str->append(pData, size * nmemb); return nmemb; } static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) { printf("size = %d\n",size); struct DowloadFile *out=(struct DowloadFile *)stream; if(out && !out->stream) { out->stream=fopen(out->filename, "wb");//打开文件进行写入 if(!out->stream) return -1; } return fwrite(buffer, size, nmemb, out->stream); } int DataTrans::download(char* pFilename,string& strUrl,string& strResponse,bool bDownload) { CURL *curl = NULL; CURLcode res; struct DowloadFile dlfile={ pFilename, //定义下载到本地的文件位置和路径 NULL }; curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); //初始化一个curl指针 if(curl) { //curl对象存在的情况下执行的操作 //设置远端地址 curl_easy_setopt(curl, CURLOPT_URL,strUrl.c_str()); if(bDownload){ //执行写入文件流操作 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);//当有数据被写入,回调函数被调用, curl_easy_setopt(curl, CURLOPT_WRITEDATA, &dlfile); //设置结构体的指针传递给回调函数 }else{ curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&strResponse); } curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 8);//连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);//接收数据时超时设置,如果10秒内数据未接收完,直接退出 //启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); curl_easy_setopt(curl, CURLOPT_USERPWD, "SUREN:SUREN"); //写入文件 res = curl_easy_perform(curl); //释放curl对象 curl_easy_cleanup(curl); if(res != CURLE_OK) { cout<= 0) { timeout.tv_sec = curl_timeo / 1000; if (timeout.tv_sec > 1) timeout.tv_sec = 1; else timeout.tv_usec = (curl_timeo % 1000) * 1000; } /* get file descriptors from the transfers */ curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); /* In a real-world program you OF COURSE check the return code of the function calls. On success, the value of maxfd is guaranteed to be greater or equal than -1. We call select(maxfd + 1, ...), specially in case of (maxfd == -1), we call select(0, ...), which is basically equal to sleep. */ rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout); switch (rc) { case -1: break; case 0: default: /* timeout or readable/writable sockets */ print_info("perform!\n"); curl_multi_perform(multi_handle, &still_running); print_info("running: %d!\n", still_running); break; } } while (still_running); curl_multi_cleanup(multi_handle); /* always cleanup */ curl_easy_cleanup(curl); /* then cleanup the formpost chain */ curl_formfree(formpost); /* free slist */ curl_slist_free_all(headerlist); } return 0; } // int DataTrans::Send_file_socket(const std::string &filename) // { // int socketfd; // struct sockaddr_in s_add,c_add; // unsigned short portnum = 9092; // int len; // char buffer[4096]; // FILE *fp ; // int file_block_length = 0; // /* // *创建socket // */ // if((socketfd = socket(AF_INET,SOCK_STREAM,0)) < 0) // { // print_error("Socket create error! \n"); // return -1; // } // /* // *设置地址 // */ // bzero(&s_add,sizeof(struct sockaddr_in)); // s_add.sin_family = AF_INET; // //s_add.sin_addr.s_addr = inet_addr(GlobalConfig::ServerIP.c_str()); // s_add.sin_addr.s_addr = inet_addr("192.168.1.19"); // s_add.sin_port = htons(portnum); // if (connect(socketfd,(struct sockaddr *)(&s_add),sizeof(struct sockaddr)) < 0) // { // print_error("Connect failure!\n"); // return -1; // } // else // print_info("Connect Success!\n"); // std::string filename = filename.substr(); // int file_name_length = (int)strlen(filename.c_str()); // if(send(socketfd,(char *)&file_name_length, sizeof(int), 0) < 0) // { // print_error("Send File_Name_Length Failed!\n"); // }else // { // print_info("Send File_Name_Length Success!\n"); // } // //发送文件名 // if(send(socketfd,filename.c_str(),file_name_length,0) < 0) // { // print_error("Send File_Name Failed!\n"); // }else // { // print_info("Send File_Name Success!\n"); // } // /* // *发送文件 // */ // fp = fopen(filename.c_str(), "r"); // if (fp == NULL) // { // print_error("File: %s Not Found!\n", filename.c_str()); // } // else // { // bzero(buffer, BUFFER_SIZE); // while( (file_block_length = fread(buffer, sizeof(char), BUFFER_SIZE, fp)) > 0) // { // print_info("file_block_length = %d\n", file_block_length); // /* // *把数据写入buffer // */ // if (send(socketfd, buffer, file_block_length, 0) < 0) // { // print_error("Send File:%s Failed!\n", filename.c_str()); // break; // } // bzero(buffer, sizeof(buffer)); // } // fclose(fp); // print_info("File: %s Transfer Finished!\n", filename.c_str()); // } // close(socketfd); // return 0; // } int DataTrans::Send_file_socket(const std::string &filename) { return 0; } int DataTrans::Send_Dir_socket(const char *dirname) { DIR *dirp; std::vector v; std::string temp; struct dirent *dp; dirp = opendir(dirname); while ((dp = readdir(dirp)) != NULL) { if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0) continue; v.push_back(std::string(dp->d_name)); } int socketfd = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in s_add,c_add; unsigned short portnum = 12345; int len; char buffer[BUFFER_SIZE]; FILE *fp ; int file_block_length = 0; /* *创建socket */ if(socketfd < 0) { print_error("Socket create error! \n"); return -1; } else { print_info("Socket create success!\n"); } /* *设置地址 */ bzero(&s_add,sizeof(struct sockaddr_in)); s_add.sin_family = AF_INET; s_add.sin_addr.s_addr = inet_addr(GlobalConfig::ServerIP.c_str()); s_add.sin_port = htons(PORT); if (connect(socketfd,(struct sockaddr *)(&s_add),sizeof(struct sockaddr)) < 0) { print_error("Connect failure!\n"); return -1; } else { print_info("Connect Success!\n"); } std::vector::iterator iter; for(iter = v.begin();iter != v.end();++iter) { temp = *iter; cout << temp.c_str() < 0) { print_info("file_block_length = %d\n", file_block_length); /* *把数据写入buffer */ if (send(socketfd, buffer, file_block_length, 0) < 0) { print_error("Send File:%s Failed!\n", filename.c_str()); break; } bzero(buffer, sizeof(buffer)); } fclose(fp); print_info("File: %s Transfer Finished!\n", filename.c_str()); } close(socketfd); return 0; } } void DataTrans::SetDebug(bool bDebug) { m_bDebug = bDebug; }