2011-09-10 81 views
0

下面是我的代碼讀取數據:無法使用libcurl的

#include <stdio.h> 
#include <string.h> 
#include <curl/curl.h> 

/* Auxiliary function that waits on the socket. */ 
static int wait_on_socket(curl_socket_t sockfd, int for_recv, long timeout_ms) 
{ 
    struct timeval tv; 
    fd_set infd, outfd, errfd; 
    int res; 

    tv.tv_sec = timeout_ms/1000; 
    tv.tv_usec= (timeout_ms % 1000) * 1000; 

    FD_ZERO(&infd); 
    FD_ZERO(&outfd); 
    FD_ZERO(&errfd); 

    FD_SET(sockfd, &errfd); /* always check for error */ 

    if(for_recv) 
    { 
    FD_SET(sockfd, &infd); 
    } 
    else 
    { 
    FD_SET(sockfd, &outfd); 
    } 

    /* select() returns the number of signalled sockets or -1 */ 
    res = select(sockfd + 1, &infd, &outfd, &errfd, &tv); 
    return res; 
} 

int main(void) 
{ 
    CURL *curl; 
    CURLcode res; 
    /* Minimalistic http request */ 
    const char *request = "reactantsJSON={\"O=O\":{\"N\":1}}&productsJSON=[\"O=O\",\"[O]\"]&temperature=2273.15&pressure=101.325"; 
    curl_socket_t sockfd; /* socket */ 
    long sockextr; 
    size_t iolen; 

    curl = curl_easy_init(); 
    if(curl) { 
    curl_easy_setopt(curl, CURLOPT_URL, "http://gibbs.sdsu.edu:8080/axis2/services/GibbsMinimization/solveTP"); 
    /* Do not do the transfer - only connect to host */ 
    curl_easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L); 
    res = curl_easy_perform(curl); 

    if(CURLE_OK != res) 
    { 
     printf("Error: %s\n", strerror(res)); 
     return 1; 
    } 

    /* Extract the socket from the curl handle - we'll need it for waiting. 
    * Note that this API takes a pointer to a 'long' while we use 
    * curl_socket_t for sockets otherwise. 
    */ 
    res = curl_easy_getinfo(curl, CURLINFO_LASTSOCKET, &sockextr); 

    if(CURLE_OK != res) 
    { 
     printf("Error: %s\n", curl_easy_strerror(res)); 
     return 1; 
    } 

    sockfd = sockextr; 

    /* wait for the socket to become ready for sending */ 
    if(!wait_on_socket(sockfd, 0, 60000L)) 
    { 
     printf("Error: timeout.\n"); 
     return 1; 
    } 

    puts("Sending request."); 
    /* Send the request. Real applications should check the iolen 
    * to see if all the request has been sent */ 
    res = curl_easy_send(curl, request, strlen(request), &iolen); 

    if(CURLE_OK != res) 
    { 
     printf("Error: %s\n", curl_easy_strerror(res)); 
     return 1; 
    } 
    puts("Reading response."); 

    /* read the response */ 
    for(;;) 
    { 
     char buf[1024]; 

     wait_on_socket(sockfd, 1, 60000L); 
     res = curl_easy_recv(curl, buf, 1024, &iolen); 

     if(CURLE_OK != res) 
     break; 

     printf("Received %u bytes.\n", iolen); 

    } 

    /* always cleanup */ 
    curl_easy_cleanup(curl); 
    } 
    return 0; 
} 

我送一個JSON字符串和我期待的響應是一個XML文檔。當我編譯我的代碼時,它編譯沒有錯誤。但由於某些原因,它不會在for循環中接收函數。任何形式的幫助,將不勝感激。提前致謝。

回答

2
$ gdb ./a.out 
GNU gdb (GDB) 7.2-ubuntu 
Copyright (C) 2010 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from a.out...done. 
(gdb) b 98 
Breakpoint 1 at 0x400f5d: file c.c, line 98. 
(gdb) run 
Starting program: a.out 
[Thread debugging using libthread_db enabled] 
Sending request. 
Reading response. 

Breakpoint 1, main() at c.c:99 
99   if(CURLE_OK != res) 
(gdb) p res 
$1 = CURLE_UNSUPPORTED_PROTOCOL 
(gdb) 

你必須把一切都在要求,而不是在curl_easy_setopt第一斜線後,所以

curl_easy_setopt(curl, CURLOPT_URL, "http://gibbs.sdsu.edu:8080"); 

const char *request = "GET /axis2/services/GibbsMinimization/solveTP?reactantsJSON={\"O=O\":{\"N\":1}}&productsJSON=[\"O=O\",\"[O]\"]&temperature=2273.15&pressure=101.325 HTTP/1.0\r\n\r\n"; 

因爲你是做手工http請求

也,方式與所有零初始化BUF是

char buf[1024]={0}; 
+0

@alexi:所以是因爲它不支持的協議的???? – user537670

+0

編輯原始答案 – alexl