2017-11-13 5 views
0

OS X에서 사용자 HWID를 PHP 스크립트를 통해 실행해야하는 프로그램을 작성하고 있습니다.이 코드는 내 코드의 함수를 사용하여 읽을 값을 표시합니다.cURL GET 요청 함수가 문자열을 반환하지 않습니다.

이 PHP 스크립트는 기본적으로 GET 요청이 만들어진 IP를 확인하고 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 : 실제로 설명서를 읽었습니다.이 설명서는 실제로 문자열을 반환하지 않거나 웹 페이지에서 읽은 내용이 아니라 플래그가있는 것으로 밝혀졌습니다. 누군가 내가 내 기능에서 잘못하고있는 것을 말할 수 있다면, 좋을 것입니다.

+0

'PHP 스크립트를 통해 '-> 어디서 PHP 스크립트가 정확합니까? –

+0

나는 그것을 지금 편집 해 봤다. 필자는 보안이 손상 될 수 있다는 사실 때문에 전체 스크립트를 공개하는 것은 불편합니다. 이는 일부 개념 인 '안티 누출'때문입니다. –

+0

@JohnKap'string'을 리턴하지 않고 'char *'를 리턴합니다. 컬은 c-API라는 것을 기억해야합니다. – user0042

답변

0

다음과 같이 사용할 수 있습니다. 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);를 호출하는 것을 잊지 마십시오.

+0

글쎄, 지금 이걸 얻고 있습니다; 'libC++ abi.dylib : 타입 std :: runtime_error의 캐치되지 않는 예외로 종료 : 잘못된/잘못된 형식 또는 URL 누락을 사용하는 URL ' 이렇게 URL을 생성하는 동안; 'std :: string url = "https://antrax.pw/asdojaOSJdu2bashDL/jaDHISJdhajKDHkas/sjhadLIUSD2bjhasjdn/ajHDIUj2nsADJhmashD/usercheck.php?hwid="+ hwid; ' –

+0

또한이'if (code!= CURLE_OK) std :: runtime_error (curl_easy_strerror (code)); ' –

+0

@JohnKap URL에'SSL' (https)이 필요하다고 생각합니다. 이를위한 추가 옵션을 설정해야합니다. 이 예제는 https://curl.haxx.se/libcurl/c/ftpsget.html에 도움이 될 수 있습니다. – Galik

관련 문제