zoukankan      html  css  js  c++  java
  • c++ liburl http get

    //#define MULTI_CURL_NUM 3
    //std::string CChatRecords::AsyncHttp(wchar_t* wxid,wchar_t* ques)
    //{
    // string url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=你好吗";
    // string proxy = "api.qingyunke.com:80";
    // unsigned int timeout = 20000;
    // int code = curl_multi_demo(wxid, url, proxy, timeout);
    //}


    //// 这里设置你需要访问的url //
    //std::string URL = "http://website.com";
    //// 这里设置代理ip和端口 //
    //std::string PROXY = "ip:port";
    //// 这里设置超时时间 //
    //unsigned int TIMEOUT = 2000; /* ms */

    //int CChatRecords::curl_multi_demo(wchar_t* wxid, string URL, string PROXY, int TIMEOUT)
    //{
    // // 初始化一个multi curl 对象 //
    // CURLM* curl_m = curl_multi_init();
    //
    // std::string RspArray[1];
    // CURL* CurlArray[1];
    // // 设置easy curl对象并添加到multi curl对象中 //
    // int num = 1;
    // for (int idx = 0; idx < num; ++idx)
    // {
    // CurlArray[idx] = NULL;
    // CurlArray[idx] = curl_easy_handler(URL, PROXY, RspArray[idx], TIMEOUT);
    // if (CurlArray[idx] == NULL)
    // {
    // return -1;
    // }
    // curl_multi_add_handle(curl_m, CurlArray[idx]);
    // }
    // /*
    // * 调用curl_multi_perform函数执行curl请求
    // * url_multi_perform返回CURLM_CALL_MULTI_PERFORM时,表示需要继续调用该函数直到返回值不是CURLM_CALL_MULTI_PERFORM为止
    // * running_handles变量返回正在处理的easy curl数量,running_handles为0表示当前没有正在执行的curl请求
    // */
    // int running_handles;
    // while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(curl_m, &running_handles))
    // {
    // cout << running_handles << endl;
    // }
    // /**
    // * 为了避免循环调用curl_multi_perform产生的cpu持续占用的问题,采用select来监听文件描述符
    // */
    // while (running_handles)
    // {
    // if (-1 == curl_multi_select(curl_m))
    // {
    // cerr << "select error" << endl;
    // break;
    // }
    // else {
    // // select监听到事件,调用curl_multi_perform通知curl执行相应的操作 //
    // while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(curl_m, &running_handles))
    // {
    // cout << "select: " << running_handles << endl;
    // }
    // }
    // cout << "select: " << running_handles << endl;
    // }
    // // 输出执行结果 //
    // int msgs_left;
    // CURLMsg* msg;
    // while ((msg = curl_multi_info_read(curl_m, &msgs_left)))
    // {
    // if (CURLMSG_DONE == msg->msg)
    // {
    // int idx;
    // for (idx = 0; idx < num; ++idx)
    // {
    // if (msg->easy_handle == CurlArray[idx])
    // break;
    // }
    // if (idx == num)
    // {
    // cerr << "curl not found" << endl;
    // }
    // else
    // {
    // cout << "curl [" << idx << "] completed with status: "
    // << msg->data.result << endl;
    // cout << "rsp: " << RspArray[idx] << endl;
    //
    // string ret = UTF8ToGBK((RspArray[idx]).c_str());
    // CString cstr(ret.c_str());
    // AfxMessageBox(_T("555555555555"));
    // AfxMessageBox(cstr);
    //
    //
    // }
    // }
    // }
    // // 这里要注意cleanup的顺序 //
    // for (int idx = 0; idx < num; ++idx)
    // {
    // curl_multi_remove_handle(curl_m, CurlArray[idx]);
    // }
    //
    // for (int idx = 0; idx < num; ++idx)
    // {
    // curl_easy_cleanup(CurlArray[idx]);
    // }
    //
    // curl_multi_cleanup(curl_m);
    // AfxMessageBox(_T("8888888888"));
    // return 0;
    //}
    //
    //size_t curl_writer(void* buffer, size_t size, size_t count, void* stream)
    //{
    // std::string* pStream = static_cast<std::string*>(stream);
    // (*pStream).append((char*)buffer, size * count);
    //
    // return size * count;
    //};
    //
    //
    //// 生成curl_easy对象
    //CURL* CChatRecords::curl_easy_handler(const std::string& sUrl,
    // const std::string& sProxy,
    // std::string& sRsp,
    // unsigned int uiTimeout)
    //{
    // CURL* curl = curl_easy_init();
    //
    // curl_easy_setopt(curl, CURLOPT_URL, sUrl.c_str());
    // curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
    //
    // if (uiTimeout > 0)
    // {
    // curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, uiTimeout);
    // }
    // if (!sProxy.empty())
    // {
    // curl_easy_setopt(curl, CURLOPT_PROXY, sProxy.c_str());
    // }
    //
    // // write function //
    // curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_writer);
    // curl_easy_setopt(curl, CURLOPT_WRITEDATA, &sRsp);
    //
    // return curl;
    //}
    //
    //
    //
    //
    //
    //// 监听
    //int CChatRecords::curl_multi_select(CURLM* curl_m)
    //{
    // int ret = 0;
    //
    // struct timeval timeout_tv;
    // fd_set fd_read;
    // fd_set fd_write;
    // fd_set fd_except;
    // int max_fd = -1;
    //
    // // 注意这里一定要清空fdset,curl_multi_fdset不会执行fdset的清空操作 //
    // FD_ZERO(&fd_read);
    // FD_ZERO(&fd_write);
    // FD_ZERO(&fd_except);
    //
    // // 设置select超时时间 //
    // timeout_tv.tv_sec = 1;
    // timeout_tv.tv_usec = 0;
    //
    // // 获取multi curl需要监听的文件描述符集合 fd_set //
    // curl_multi_fdset(curl_m, &fd_read, &fd_write, &fd_except, &max_fd);
    //
    // /**
    // * When max_fd returns with -1,
    // * you need to wait a while and then proceed and call curl_multi_perform anyway.
    // * How long to wait? I would suggest 100 milliseconds at least,
    // * but you may want to test it out in your own particular conditions to find a suitable value.
    // */
    // if (-1 == max_fd)
    // {
    // return -1;
    // }
    //
    // /**
    // * 执行监听,当文件描述符状态发生改变的时候返回
    // * 返回0,程序调用curl_multi_perform通知curl执行相应操作
    // * 返回-1,表示select错误
    // * 注意:即使select超时也需要返回0,具体可以去官网看文档说明
    // */
    // int ret_code = ::select(max_fd + 1, &fd_read, &fd_write, &fd_except, &timeout_tv);
    // switch (ret_code)
    // {
    // case -1:
    // /* select error */
    // ret = -1;
    // break;
    // case 0:
    // /* select timeout */
    // default:
    // /* one or more of curl's file descriptors say there's data to read or write*/
    // ret = 0;
    // break;
    // }
    //
    // return ret;
    //}

  • 相关阅读:
    ueditor实现ctrl+v粘贴word图片并上传
    fckeditor实现ctrl+v粘贴word图片并上传
    kindeditor实现ctrl+v粘贴word图片并上传
    ckeditor实现ctrl+v粘贴word图片并上传
    html大文件传输功能
    html大文件传输解决方案
    html大文件传输教程
    html大文件传输方案
    PDI(Kettle)的使用六 kitchen
    PDI(Kettle)的使用五 Pan
  • 原文地址:https://www.cnblogs.com/zhangtq/p/11940709.html
Copyright © 2011-2022 走看看