C ++ CURL不返回特定URL

时间:2016-11-24 19:53:40

标签: c++ ubuntu curl cgi

我想将CGI命令发送到IP摄像头。 我发e.a. CGI url接收摄像机名称,函数返回正确的名称,所以我认为我的代码很好。

当我从浏览器发送另一个CGI URL时,它正在工作(相机返回“ok”)但是当我尝试使用我的程序发送它时,我的相机没有返回任何内容,并且参数未设置在相机中。

这是我的代码:

string data; //will hold the url's contents
size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{   for (int c = 0; c<size*nmemb; c++)
    {
        data.push_back(buf[c]);
    }
    return size*nmemb; //tell curl how many bytes we handled
}


string send_CGI_command(string username, string password, string port, string URL)
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
                curl_global_init(CURL_GLOBAL_ALL); //pretty obvious
                curl = curl_easy_init();

                curl_easy_setopt(curl, CURLOPT_PORT , stoll (port,0,0) );

                curl_easy_setopt(curl, CURLOPT_USERNAME  , username.c_str());
                curl_easy_setopt(curl, CURLOPT_USERPWD  , (username + ":" + password).c_str());
                curl_easy_setopt(curl, CURLOPT_HTTPAUTH  , CURLAUTH_BASIC);

                curl_easy_setopt(curl, CURLOPT_URL, (URL).c_str());

                curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
                curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

                curl_easy_perform(curl);
                curl_easy_cleanup(curl);
                curl_global_cleanup();                             

                return data;
            }
}

我使用此命令请求CGI:

string result = send_CGI_command(get_video_login_cam1(),get_video_password_cam1(),get_video_port_cam1(),"http://" + get_video_ip_cam1() + "/cgi-bin/configManager.cgi?action=setConfig&Locales.DSTEnable=true&Locales.DSTEnd.Day=0&Locales.DSTEnd.Hour=3&Locales.DSTEnd.Minute=0&Locales.DSTEnd.Month=10&Locales.DSTEnd.Week=-1&Locales.DSTEnd.Year=" + std::to_string(1900 + ltm->tm_year) + "&Locales.DSTStart.Day=0&Locales.DSTStart.Hour=2&Locales.DSTStart.Minute=0&Locales.DSTStart.Month=3&Locales.DSTStart.Week=-1&Locales.DSTStart.Year=" + std::to_string(1900 + ltm->tm_year) + "&Locales.TimeFormat=dd-MM-YYYY HH:mm:ss");  

    cout << endl << result << endl;

这是调试器信息:

*   Trying 192.168.1.14...
* Connected to 192.168.1.14 (192.168.1.14) port 80 (#0)
* Server auth using Basic with user 'admin'
> GET /cgi-bin/configManager.cgi?action=setConfig&Locales.DSTEnable=true&Locales.DSTEnd.Day=0&Locales.DSTEnd.Hour=3&Locales.DSTEnd.Minute=0&Locales.DSTEnd.Month=10&Locales.DSTEnd.Week=-1&Locales.DSTEnd.Year=2016&Locales.DSTStart.Day=0&Locales.DSTStart.Hour=2&Locales.DSTStart.Minute=0&Locales.DSTStart.Month=3&Locales.DSTStart.Week=-1&Locales.DSTStart.Year=2016&Locales.TimeFormat=dd-MM-YYYY HH:mm:ss HTTP/1.1
Host: 192.168.1.14
Authorization: Basic YWRtaW46YWRtaW4=
Accept: */*

* Empty reply from server
* Connection #0 to host 192.168.1.14 left intact

我不知道为什么我的完全相同的CGI在浏览器中工作,并且完全相同的cgi不会使用CURL撤回任何内容。就像我在开始时所说的那样,获取设备名称的另一个CGI命令在浏览器中工作并具有相同的CURL代码。

提前感谢您的建议。

0 个答案:

没有答案