我想写一个检索网页的函数
I want to write a function that retrieves a webpage
我正在尝试编写一个 returns 指定 URL 的 html 代码的函数
到目前为止,这是我的代码:
char * getHtml()
{
struct BufferStruct buffer;
CURLcode result;
CURL *myHandle;
printf("success\n");
// Passing the function pointer to LC
curl_easy_setopt(myHandle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
printf("success\n");
// Passing our BufferStruct to LC
curl_easy_setopt(myHandle, CURLOPT_WRITEDATA, (void *)&buffer);
curl_easy_setopt(myHandle, CURLOPT_URL, "http://www.example.com");
result = curl_easy_perform( myHandle );
curl_easy_cleanup( myHandle );
return buffer.buffer;
}
仅打印第一个成功字符串:
成功
./compile: line 3: 27548 Segmentation fault ./a.out
这是我的 writememorycallback:
static size_t WriteMemoryCallback (void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
struct BufferStruct *mem = (struct BufferStruct *) data;
mem->buffer = realloc(mem->buffer, mem->size + realsize + 1);
if (mem->buffer == NULL)
return 0;
if (mem->buffer)
{
memcpy(&(mem->buffer[ mem->size ]), ptr, realsize);
mem->size += realsize;
mem->buffer[ mem->size ] = 0;
}
return realsize;
}
将相同的代码嵌入到 main 函数的主体中时工作正常。
您从不初始化 buffer
,您应该将 buffer.buffer
设置为 NULL
以便 realloc()
像您期望的那样工作,并且 buffer.size
必须是初始化为或您的程序将调用未定义的行为。
您应该在 getHtml()
中执行此操作
buffer.buffer = NULL;
buffer.size = 0;
在 curl_easy_perform()
.
之前
此外,要以安全的方式使用 realloc()
,请执行此操作
void *aux;
aux = realloc(mem->buffer, mem->size + realsize + 1);
if (aux == NULL)
return 0; // Maybe `free(mem->buffer); mem->buffer = NULL; mem->size = 0;'
mem->buffer = aux;
// Continue, memcpy() and update mem->size
如果仅打印出第一个字符串 success,则可能是第一次调用 curl 函数时出现问题。
您应该做的第一步是检查 curl 函数的每个 return 值:
CURLcode ok = curl_easy_setopt(myHandle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
if( ok != CURLE_OK )
{
printf( "Error here %d\n" , __LINE__ );
}
第一次调用 curl 函数失败的真正原因是 CURL *myHandle
没有初始化:
所以初始化它:
CURL *myHandle= curl_easy_init();
if(!myHandle) { /*handle error ...*/ }
完成后将其删除:
curl_easy_cleanup(myHandle);
已经指出的另一个问题是 struct BufferStruct buffer
未初始化,因此当使用未初始化的指针调用时,WriteMemoryCallback 中的 realloc 失败。
我正在尝试编写一个 returns 指定 URL 的 html 代码的函数 到目前为止,这是我的代码:
char * getHtml()
{
struct BufferStruct buffer;
CURLcode result;
CURL *myHandle;
printf("success\n");
// Passing the function pointer to LC
curl_easy_setopt(myHandle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
printf("success\n");
// Passing our BufferStruct to LC
curl_easy_setopt(myHandle, CURLOPT_WRITEDATA, (void *)&buffer);
curl_easy_setopt(myHandle, CURLOPT_URL, "http://www.example.com");
result = curl_easy_perform( myHandle );
curl_easy_cleanup( myHandle );
return buffer.buffer;
}
仅打印第一个成功字符串: 成功
./compile: line 3: 27548 Segmentation fault ./a.out
这是我的 writememorycallback:
static size_t WriteMemoryCallback (void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
struct BufferStruct *mem = (struct BufferStruct *) data;
mem->buffer = realloc(mem->buffer, mem->size + realsize + 1);
if (mem->buffer == NULL)
return 0;
if (mem->buffer)
{
memcpy(&(mem->buffer[ mem->size ]), ptr, realsize);
mem->size += realsize;
mem->buffer[ mem->size ] = 0;
}
return realsize;
}
将相同的代码嵌入到 main 函数的主体中时工作正常。
您从不初始化 buffer
,您应该将 buffer.buffer
设置为 NULL
以便 realloc()
像您期望的那样工作,并且 buffer.size
必须是初始化为或您的程序将调用未定义的行为。
您应该在 getHtml()
buffer.buffer = NULL;
buffer.size = 0;
在 curl_easy_perform()
.
此外,要以安全的方式使用 realloc()
,请执行此操作
void *aux;
aux = realloc(mem->buffer, mem->size + realsize + 1);
if (aux == NULL)
return 0; // Maybe `free(mem->buffer); mem->buffer = NULL; mem->size = 0;'
mem->buffer = aux;
// Continue, memcpy() and update mem->size
如果仅打印出第一个字符串 success,则可能是第一次调用 curl 函数时出现问题。
您应该做的第一步是检查 curl 函数的每个 return 值:
CURLcode ok = curl_easy_setopt(myHandle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
if( ok != CURLE_OK )
{
printf( "Error here %d\n" , __LINE__ );
}
第一次调用 curl 函数失败的真正原因是 CURL *myHandle
没有初始化:
所以初始化它:
CURL *myHandle= curl_easy_init();
if(!myHandle) { /*handle error ...*/ }
完成后将其删除:
curl_easy_cleanup(myHandle);
已经指出的另一个问题是 struct BufferStruct buffer
未初始化,因此当使用未初始化的指针调用时,WriteMemoryCallback 中的 realloc 失败。