libcurl在VS 2008下的HTTPS请求和崩溃

时间:2014-01-08 00:28:51

标签: winapi visual-c++ openssl libcurl

固定:谢谢伊戈尔 修复在底部。

我想使用VS 2008向Android发送意图。我想,这不是一个更简单的要求。虽然Openssl正在崩溃,但它很好奇。让我们从代码开始:

#include <stdio.h>
#include <conio.h>
#include <curl/curl.h>
#include <string>
#include <iostream>
using namespace std;
#pragma comment( lib, "ws2_32.lib" )

int main(void)
{
   CURL *curl;
   CURLcode res = CURL_LAST;

   curl_global_init( CURL_GLOBAL_DEFAULT );

   curl = curl_easy_init();
   if(curl) 
   {
      string website = "https://android.googleapis.com/gcm/send";
      const char* headers [] = { "Content-Type: application/json", "Authorization:key=..."   };
      string json = "{ 'registration_ids':['...']}";//, 'data':'none'}";

      curl_easy_setopt( curl, CURLOPT_URL, website.c_str() );
      curl_easy_setopt( curl, CURLOPT_HTTPHEADER, headers );
      //curl_easy_setopt( curl, CURLOPT_POSTFIELDS, json.c_str() ); << not currently needed
      curl_easy_setopt( curl, CURLOPT_SSL_VERIFYPEER, FALSE ); // --insecure or -k

      try
      {
         res = curl_easy_perform( curl );  << crashes here!
      }
      catch( ... ) {}

其余的代码实际上并不重要,而且这段代码是样板文件。崩溃点位于curl_easy_perform。错误是:

Unhandled exception at 0x61524ffb in HTTPS_sender01.exe: 0xC0000005: 
Access violation         reading location 0x68747541.

所以这在curllib.dll深处崩溃,似乎是对openssl的调用,但我无法确定。但是,如果我注释掉选项CURLOPT_SSL_VERIFYPEER,那么这运行正常但是android服务器因为没有证书而拒绝我。

下载源几乎无处可去,因为这需要openssl,谁知道在哪里下载正确的版本(我找到了大约30个站点...所有包含GunWin32的不同版本,我现在有这么多的下载文件夹,我不知道该怎么做)。我也不知道哪些版本的libs用于libcurl for vs 2008.经过几天的查看,我认为我会寻求指导或帮助。

对于来自visual studio的https for android的任何想法。顺便说一句,我最终需要将它移植到linux,所以任何建议都可能有用。

libcurl从这里下载:http://www.dll-files.com。包含和来源来自7.19.3。这个lib附带了一个openssl版本......我复制了这里的说明...... http://quantcorner.wordpress.com/2012/04/08/using-libcurl-with-visual-c-2010/

另外,我确实尝试使用libcurl中的openssl证书...开源证书,并且Android.google拒绝了:

curl_easy_setopt( curl, CURLOPT_CAPATH, "C:/projects/libraries/libcurl/curl-ca-bundle.crt");

FIX:

  struct curl_slist *slist=NULL;
  int numHeaders = sizeof( headers) / sizeof(headers[0]);

  for( int i=0; i<numHeaders; i++ )
  {
     slist = curl_slist_append( slist, headers[i] );
  }
  curl_easy_setopt( curl, CURLOPT_HTTPHEADER, slist );

1 个答案:

答案 0 :(得分:2)

CURLOPT_HTTPHEADER选项不接受您似乎相信的char*指针数组,但curl_slist*指针是从curl_slist_append获得的。