Я пишу программу в OS X, которая требует запустить HWID пользователей через PHP-скрипт, который затем будет эхо-значение, которое будет прочитано с помощью функции в моем коде.
Этот PHP-скрипт, в основном, проверяет IP-адрес, с которого был сделан запрос GET, проверяет, существует ли IP-адрес в таблице, если он это делает, затем проверьте другие значения, например, если данный HWID верен, или если пользователь является премиальным и затем возвращает строку в соответствии с этим.
Это функция здесь;
string pullResult(string hwid) { CURL* curl; string result; curl = curl_easy_init(); std::string url = "removed/usercheck.php?hwid=" + hwid; curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); result = curl_easy_perform(curl); return result; }
И здесь он называется;
if(al.pullResult(hwid) == "no such user") cout << "no such user" << endl;
Однако использование этой функции не работает. Я могу войти в свой браузер и сделать запрос GET, и скрипт вернет правильные строки, но это просто не возвращает строку.
Теперь, я знаю, что я проверяю правильную строку, поскольку у меня есть все настройки для этой строки, чтобы быть результатом.
EDIT: Я действительно прочитал руководство сейчас, LOL, и узнал, что это не вернет строку или то, что читается с веб-страницы, а это собственная вещь флагов. Если кто-то может сказать мне, что я делаю неправильно в своей функции, это было бы здорово.
Вы можете использовать что-то вроде этого. Он передает указатель на объект std::string
для функции обратного вызова, которая добавляет возвращаемые данные в переданную в std::string
. Существует очень мало способов проверки ошибок. В реальном коде каждый вызов функции должен быть проверен на наличие ошибок.
#include <memory> #include <stdexcept> #include <string> #include <curl/curl.h> std::size_t http_write(void* buf, std::size_t size, std::size_t nmemb, void* userp) { if(auto page_data_ptr = static_cast<std::string*>(userp)) { page_data_ptr->append(static_cast<char*>(buf), size * nmemb); return size * nmemb; } return 0; } std::string http_get(std::string const& url) { // I use a unique_ptr to automatically call the cleanup function // so we don't need to do it later after the call std::unique_ptr<CURL, void(*)(CURL*)> curl{curl_easy_init(), curl_easy_cleanup}; curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, &http_write); curl_easy_setopt(curl.get(), CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curl.get(), CURLOPT_FOLLOWLOCATION, 1L); std::string page_data; // collect the results curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &page_data); curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str()); CURLcode code = curl_easy_perform(curl.get()); if(code != CURLE_OK) throw std::runtime_error(curl_easy_strerror(code)); return page_data; }
ПРИМЕЧАНИЕ. Не забудьте вызвать curl_global_init(CURL_GLOBAL_DEFAULT);
один раз перед вызовом этой функции.