2014-02-06 2 views
2

현재 http를 요청하기 위해 C를 사용해야하는 프로젝트를 진행 중입니다. 나는 곱슬 곱슬을 사용하여 이것을하려고합니다. 그러나 응답 메시지가 표시됩니다.C에서 Curl을 사용하는 지원되지 않는 프로토콜

error: unable to request data from https://coinex.pw/api/v2/currencies: 
Unsupported protocol 

오류가 컬링이나 서버에서 발생하는지 확실하지 않습니다. 다음은 예제 코드에서 빌린 코드입니다.

#include <curl/curl.h> 

static char *request(const char *url) 
{ 
CURL *curl = NULL; 
CURLcode status; 
struct curl_slist *headers = NULL; 
char *data = NULL; 
long code; 

curl_global_init(CURL_GLOBAL_ALL); 
curl = curl_easy_init(); 
if(!curl) 
    goto error; 

data = malloc(BUFFER_SIZE); 
if(!data) 
    goto error; 

struct write_result write_result = { 
    .data = data, 
    .pos = 0 
}; 

curl_easy_setopt(curl, CURLOPT_URL, url); 

headers = curl_slist_append(headers, "Content-type: application/json"); 
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_response); 
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_result); 

status = curl_easy_perform(curl); 
if(status != 0) 
{ 
    fprintf(stderr, "error: unable to request data from %s:\n", url); 
    fprintf(stderr, "%s\n", curl_easy_strerror(status)); 
    goto error; 
} 

curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &code); 
if(code != 200) 
{ 
    fprintf(stderr, "error: server responded with code %ld\n", code); 
    goto error; 
} 

curl_easy_cleanup(curl); 
curl_slist_free_all(headers); 
curl_global_cleanup(); 

/* zero-terminate the result */ 
data[write_result.pos] = '\0'; 

return data; 

error: 
if(data) 
    free(data); 
if(curl) 
    curl_easy_cleanup(curl); 
if(headers) 
    curl_slist_free_all(headers); 
curl_global_cleanup(); 
return NULL; 
} 

팁/힌트를 환영합니다.

답변

8

curl (및 libcurl) URL의 프로토콜 부분을 해석 할 수 없을 때 지원되지 않는 프로토콜 오류가 발생합니다. 귀하의 경우에는 약간 이상한 https:을 의미합니다.

먼저 명령 줄에서 curl 도구를 사용하여 URL을 검색 할 수 있는지 확인하십시오.

curl -V 당신에게 지원하는 프로토콜 curl (따라서 libcurl)의 목록을 제공합니다 :이

$ curl -V 
curl 7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3 
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp rtsp smtp smtps telnet tftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP 

확인 https있다. libcurl이 SSL 라이브러리에 대해 구축되지 않았거나 SSL 라이브러리가 설치되어 있지 않은 것일 수 있습니다.

마지막으로이 페이지에서 : http://curl.haxx.se/libcurl/c/example.html은 간단한 https 예제 (두 번째로 아래쪽)입니다. libcurl으로 작동하는지 확인하십시오. 그렇다면, 나는 당신의 프로그램이 무엇을하고 있는지를 알 수 있습니다. 그렇지 않은 경우 귀하의 libcurl 설치에 무엇이 잘못된 것인지 알 수 있습니다.

+0

컬을 설치 한 후 open ssl을 설치했습니다. 나는 컬을 다시 만들어 그것을 작동합니다. 고맙습니다. –

-3

URL에 "http"가 있지만 "https"를 사용하십시오.

+0

답변에 몇 가지 문제가 있습니다. 1. 서버에 대한 암호화되지 않은 연결을 생성합니다. 이는 이상적이지 않으며 원치 않을 수도 있습니다. 2. 모든 서버가 암호화되지 않은 HTTP 연결을 허용하지는 않습니다. –

관련 문제