Hello,
I am new to this mailinglist and from Germany.
So sorry for my bad English and thank you very much for your help!
I wrote a MFC program with Visual C++ 6.0 (I know its an old version).
In the program I have got six threads, which download information via
HTTP and HTTPS (GET and POST + Cookies) from different webservers.
At the beginning I were really happy with cURL, but when I send my
program into a longtime test, I got an "accessviolation error" in
libeay32.dll
I'm sending you my class as an attachment.
In the program I'm doing all the communication via one instance of the
class:
CCommunicator myCommunicator;
I tried an own instance for every thread but I got the same error.
I'm not getting the error when I'm doing all the communication in one
thread, but then everything is really slow.
Can the multi-interface solve my problem? How to do that? The code
examples didn't fit my needs.
Thank you very much in advance.
Michael
--
Communicator1.h
--
// Communicator1.h: Schnittstelle für die Klasse CCommunicator.
//
//////////////////////////////////////////////////////////////////////
#if
!defined(AFX_COMMUNICATOR1_H__14D5C2D3_54BE_4E76_9A00_0A8A06FAAEF6__INCLUDED_)
#define AFX_COMMUNICATOR1_H__14D5C2D3_54BE_4E76_9A00_0A8A06FAAEF6__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "std_include.h"
#include "Stringmanager.h"
class CCommunicator
{
public:
CCommunicator();
virtual ~CCommunicator();
bool communicate(CString url, CString &quellcode, CString POST);
bool execute(CString url, CString &quellcode, CString POST);
int repeat_requests;
};
#endif //
!defined(AFX_COMMUNICATOR1_H__14D5C2D3_54BE_4E76_9A00_0A8A06FAAEF6__INCLUDED_)
--
Communicator1.cpp
--
// Communicator1.cpp: Implementierung der Klasse CCommunicator.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Stringmanager.h"
#include "Communicator1.h"
// Für Curl
#include <errno.h>
#include <time.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Konstruktion/Destruktion
//////////////////////////////////////////////////////////////////////
CCommunicator::CCommunicator()
{
repeat_requests = 4;
}
CCommunicator::~CCommunicator()
{
}
//
// Curl: Reallocation of the memory
//
void *myrealloc(void *ptr, size_t size)
{
if(ptr) return realloc(ptr, size);
else return malloc(size);
}
//
// Curl: Callback zum Speicern der Daten
//
size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb,
void *data)
{
size_t realsize = size * nmemb;
struct CCommunicator_MemoryStruct *mem = (struct
CCommunicator_MemoryStruct *)data;
mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize
+ 1);
if (mem->memory)
{
memcpy(&(mem->memory[mem->size]), ptr, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
}
return realsize;
}
bool CCommunicator::communicate(CString url, CString &quellcode, CString
POST)
{
bool res;
int i=0;
while(i<repeat_requests)
{
res = execute(url,quellcode,POST);
if(!res) i++;
else break;
}
return res;
}
//
// Curl: Send-Request
//
bool CCommunicator::execute(CString url, CString &quellcode, CString POST)
{
quellcode = "";
CURL *curl_handle;
CURLcode result;
struct CCommunicator_MemoryStruct chunk;
chunk.memory = NULL;
chunk.size = 0;
char nline[256];
bool rueckgabe = true;
// Initiierung der Curl-Session
curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
if (curl_handle)
{
// Optionen der Session
//
// Einstellungen für https
if(url.Find("https")!=-1)
{
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 2);
}
// User-Agent bestimmen
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "myAgent");
// URL, die abgefragt werden soll
curl_easy_setopt(curl_handle, CURLOPT_URL, url);
// Die Gesamte Kommunikation mit dem Server wird protokolliert
// curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1);
// This is not working. I never get the additional information
in my callback function. Why?
// Klasse soll alle Daten an WriteMemoryCallback senden
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION,
WriteMemoryCallback);
// Über gabe des "chunk" structs an die Callback-Funktion
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
// Cookie-Engine starten
curl_easy_setopt(curl_handle, CURLOPT_COOKIEFILE, "");
// Alte Cookies löschen
curl_easy_setopt(curl_handle, CURLOPT_COOKIELIST, "ALL");
// POST - Daten
if(POST!="")
curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, POST);
//
////
// Cookies setzen
//
_snprintf(nline, 256,
"Set-Cookie: myCookie=myData;"
"expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/;
domain=.xyz.com");
curl_easy_setopt(curl_handle, CURLOPT_COOKIELIST, nline);
//
////
//
// Anfrage ausführen
//
result = curl_easy_perform(curl_handle);
if (result != CURLE_OK) {
fprintf(stderr, "Curl perform failed: %s\n",
curl_easy_strerror(result));
quellcode.Format("Anfrage wurde nicht beantwortet.\r\nBitte
überprüfen Sie die Internetverbindung!\r\n\r\nMeldung:
%s",curl_easy_strerror(result));
rueckgabe = false;
}
//
// TMP: Ausgabe
//
if(quellcode=="" && rueckgabe)
quellcode = chunk.memory;
}
else
{
quellcode = "curl_handle konnte nicht initiiert werden!\r\nBitte
kontaktieren Sie den Support.";
rueckgabe = false;
}
// 1. Ausnahmefehler
if(quellcode.Find("The requested URL could not be retrieved")!=-1)
rueckgabe = false;
// 2. Ausnahmefehler
if(quellcode.Find("Service Unavailable")!=-1)
rueckgabe = false;
//
// Aufräumen
//
curl_easy_cleanup(curl_handle);
curl_global_cleanup();
if(chunk.memory) free(chunk.memory);
return rueckgabe;
}
_______________________________________________
cURLpp mailing list
[email protected]
http://www.rrette.com/mailman/listinfo/curlpp