2014-03-25 4 views
1

В рамках проекта мне нужно реализовать libcurl на пользовательском устройстве WindowsCE, которое затем ведет переговоры с сервером по проводной локальной сети и GET, POST и DELETEs данным (Используется язык программирования, который я использую: C). Это до тех пор, пока я продвинулся:libcurl на Windows CE - curl_easy_perform (...) не возвращается

  1. Я нашел пару учебников для повторной реализации библиотеки для моего устройства CE. (http://stasyan.wordpress.com/2009/12/08/libcurl-for-windows-mobile-and-windows-ce/ и http://rxwen.blogspot.com/2012/05/port-libcurl-to-wince.html сделать действительно хорошую работу.)

  2. я смог построить DLL и статические библиотеки Libcurl, который я тогда связан с моим Visual Studio 2005 приложения.

  3. Я подключил свое пользовательское устройство CE и сервер к коммутатору. Я могу выполнить ping-сервер с устройства CE и наоборот, поэтому я знаю, что они могут отправлять и получать данные друг к другу.

  4. На моем сервере (Linux) используется веб-сервер lighttpd, который отлично работает, когда я запрашиваю URL-адрес (показано в коде ниже) с моего ПК с ОС Windows, который также подключен к коммутатору N/W.

Это код, который я использовал для моего тестового приложения:

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

int main(void) 
{ 
    printf("STARTING APP...\n"); 
    CURL *curl; 
    CURLcode res; 

    printf("curl = curl_easy_init();\n"); 
    curl = curl_easy_init(); 
    if(curl) 
    { 
     printf("Enabling followlocation...\n"); 
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1l); 

     printf("Setting Verbose...\n"); 
     curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 

     printf("Setting Connect time out...\n"); 
     curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5); 

     printf("Setting Server time out...\n"); 
     curl_easy_setopt(curl, CURLOPT_ACCEPTTIMEOUT_MS , 5000); 

     printf("Setting URL...\n"); 
     curl_easy_setopt(curl, CURLOPT_URL, "http://165.26.79.10:8080"); 

     /* Perform the request, res will get the return code */ 
     printf("Perform(curl)...;\n"); 
     res = curl_easy_perform(curl); 

     /* Check for errors */ 
     if(res != CURLE_OK) 
       fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); 

     else 
      printf("\nGET sucessful.\n"); 

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

Моя проблема заключается в том, что приложение никогда не возвращается. Он не продвигается даже после curl_easy_perform (curl).

Это выход я получаю (Google Drive ссылка): [http://goo.gl/IKgiqW]

Что я мог делать неправильно ??

+1

Вы должны отправить решение в ответ, а затем принять его, когда наступит время. –

+0

Выполнено. Спасибо! – ash

ответ

0

Мне удалось выяснить, в чем проблема.

Команда curl_easy_perform (...) переходит в бесконечный цикл, вызванный ошибкой в ​​одном из файлов библиотеки совместимости. Он упоминается в форуме разработки Curl (Google), но я кратко его ниже:

Библиотеки совместимости ЗЦА я (https://github.com/mauricek/wcecompat/) есть файл под названием wce211_string.c. Функция внутри файла, _CRTIMP char * __cdecl strrchr (const char * s, int c), использует указатель const char * p, который не декрементирован. Чтобы исправить эту ошибку, добавьте строку: p- = 1; после строки «возврата (символ *) р;», так что функция будет следующим образом:

_CRTIMP char* __cdecl strrchr(const char* s, int c) 
{ 
    const char* p = s + strlen(s) - 1; 
    while (p >= s) 
    { 
     if (*p == c) 
      return (char*)p; 
     p -= 1; 
    } 
    return NULL; 
} 

Это устраняет бесконечную задачу по замкнутому кругу.

Смежные вопросы