libcurl 可能是最便携、最强大和最常用的 这个星球上的网络传输库。官方提供的示例,需要在项目中引用到libcurl-imp.lib才能使用。
这里我改造了下工程,将常用的接口导出到了libcurl.dll中方便直接在后续的工程代码中应用,下面可以看到dll常用的使用接口:
libcurl.dll中接口的导出: libcurl.c
#include<stdio.h>
#include "curl/curl.h"
#include "libcurl.h"
#define UNZ_OK (0)
#define Z_ERRNO (-1)
#define UNZ_ERRNO (Z_ERRNO)typedef CURLcode(*Curl_global_init)(long);
typedef struct Curl_easy* (*Curl_easy_init)(void);
//typedef CURLcode(*Curl_easy_setopt)(CURL*, CURLoption, ...);
typedef CURLcode(*Curl_easy_perform)(CURL*);
typedef void (*Curl_easy_cleanup)(CURL*);
typedef void (*Curl_global_cleanup)(void);//定义API函数变量
HMODULE curlDll;
int curl_load = UNZ_ERRNO;
static Curl_global_init _curl_global_init;
static Curl_easy_init _curl_easy_init;
//static Curl_easy_setopt _curl_easy_setopt;
static Curl_easy_perform _curl_easy_perform;
static Curl_easy_cleanup _curl_easy_cleanup;
static Curl_global_cleanup _curl_global_cleanup;int libcurl_init() {char path[] = "D:\\D-Pro\\Summary\\libcurl\\Debug\\libcurl.dll";if (curl_load == UNZ_OK)return UNZ_OK;curlDll = LoadLibrary(path);if (curlDll != NULL) {_curl_global_init = (Curl_global_init)GetProcAddress(curlDll, "curl_global_init");_curl_easy_init = (Curl_easy_init)GetProcAddress(curlDll, "curl_easy_init");_curl_easy_setopt = (Curl_easy_setopt)GetProcAddress(curlDll, "curl_easy_setopt");_curl_easy_perform = (Curl_easy_perform)GetProcAddress(curlDll, "curl_easy_perform");_curl_easy_cleanup = (Curl_easy_cleanup)GetProcAddress(curlDll, "curl_easy_cleanup");_curl_global_cleanup = (Curl_global_cleanup)GetProcAddress(curlDll, "curl_global_cleanup");curl_load = UNZ_OK;return UNZ_OK;}return UNZ_ERRNO;
}
CURLcode libcurl_global_init(long flags)
{if (curl_load == UNZ_OK)return _curl_global_init(flags);
}
CURLcode libcurl_easy_perform(CURL* curl) {return _curl_easy_perform(curl);
}
void libcurl_easy_cleanup(CURL* curl) {_curl_easy_cleanup(curl);
}
void libcurl_global_cleanup(void) {_curl_global_cleanup();
}
struct Curl_easy* libcurl_easy_init()
{return _curl_easy_init();
}
//CURLcode libcurl_easy_setopt(struct Curl_easy* data, CURLoption tag, ...)
//{
// va_list arg;
// CURLcode result;
//
// if (!data)
// return CURLE_BAD_FUNCTION_ARGUMENT;
//
// va_start(arg, tag);
//
// result = _curl_easy_setopt(data, tag, arg);
//
// va_end(arg);
// return result;
//}
相关操作接口的声明:libcurl.h
#pragma once
#include <curl/curl.h>
#ifndef __LIBCURL_H__
#define __LIBCURL_H__
#ifdef __cplusplus
extern "C" {
#endiftypedef CURLcode(*Curl_easy_setopt)(CURL*, CURLoption, ...);Curl_easy_setopt _curl_easy_setopt;int libcurl_init();void libcurl_easy_cleanup(CURL* curl);void libcurl_global_cleanup(void);struct Curl_easy* libcurl_easy_init();CURLcode libcurl_global_init(long flags);CURLcode libcurl_easy_perform(CURL* curl);//CURLcode libcurl_easy_setopt(struct Curl_easy* data, CURLoption tag, ...);
#define libcurl_easy_setopt _curl_easy_setopt
#ifdef __cplusplus
}
#endif#endif /* __LIBCURL_H__ */
http访问测试应用示例: test.c
#include <stdio.h>
#include "curl/curl.h"
#include "libcurl.h"
#include "gb2312.h"
unsigned int read_callback(void* ptr, size_t size, size_t nmemb, void* userp)
{char* pTmp = (char*)userp;unsigned long sizes = size * nmemb;if (!ptr){return 0;}strncpy(pTmp, (char*)ptr, sizes);return sizes;}
int Post(char* szUrl, char* szParameter, char* szResult, char* szErrorMessage)
{CURL* curl = NULL;CURLcode res;struct curl_slist* headers = NULL;res = libcurl_global_init(CURL_GLOBAL_ALL);if (res != CURLE_OK){szErrorMessage = "下载过程初始化错误!";return 0;}curl = libcurl_easy_init();if (curl){libcurl_easy_setopt(curl, CURLOPT_URL, szUrl);libcurl_easy_setopt(curl, CURLOPT_POST, 1L);libcurl_easy_setopt(curl, CURLOPT_POSTFIELDS, szParameter);libcurl_easy_setopt(curl, CURLOPT_ENCODING, "");libcurl_easy_setopt(curl, CURLOPT_WRITEDATA, szResult);libcurl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, read_callback);libcurl_easy_setopt(curl, CURLOPT_TIMEOUT, 4); res = libcurl_easy_perform(curl);if (res != CURLE_OK){szErrorMessage = "通讯失败, 请检查线路!";return 0;}libcurl_easy_cleanup(curl);}libcurl_global_cleanup();return 1;
}
int main() {char result[1000];char msg[1000];memset(result, 0, 1000);libcurl_init();Post("http://XXXXXXXXXXXX", "", result, msg);printf("\nresult:%s", result);return 0;
}
http访问运行结果:
跟网页访问的结果是一样的。 这里我发现有个乱码问题。利用前面提到的转编码问题即可解决。