作为项目的一部分,我需要在自定义WindowsCE设备上实现libcurl,然后通过有线LAN和GET,POST和DELETE数据与服务器通信(我使用的编程语言是 C )。这是我所取得的进展:
我找到了几个教程来为我的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做得非常好。)
我能够构建一个DLL和一个静态libcurl库,然后将其链接到我的Visual Studio 2005应用程序。
我将自定义CE设备和服务器连接到交换机。我可以从CE设备ping服务器,反之亦然,所以我知道他们都能够相互发送和接收数据。
我的服务器(Linux)使用lighttpd网络服务器,当我从连接到N / W开关的Windows PC请求URL(如下面的代码所示)时,它工作得很好。
这是我用于测试应用的代码:
#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]
我可能做错了什么?
答案 0 :(得分:0)
我设法找出问题所在。
由于兼容性库中某个文件中的错误,curl_easy_perform(...)命令进入无限循环。它在cURL开发论坛(google it)中引用,但我在下面对其进行了总结:
我使用的WCE兼容性库(https://github.com/mauricek/wcecompat/)有一个名为 wce211_string.c 的文件。文件中的函数 _CRTIMP char * __cdecl strrchr(const char * s,int c),使用不减少的const char * p指针。要修复此错误,请在行后面添加以下行: p- = 1; &#39;返回(char *)p;&#39;,这样功能将内容如下:
_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;
}
这解决了无限循环问题。