一、运用开源库libcurl开发http请求客户端,实现文件上传和字符串发送的功能
/******************************************************
*** Copyright(C)
*** author Lu GuoFu
*** date 2018-07-25
*******************************************************/
#include <>
#include <sys/>
#include <>
#include <>
#include <>
#include <>
#include <sys/>
#include <sys/>
#include <>
#include <curl/>
#include <sys/>
#include <>
#include <sys/>
#define POST_FILE_URL "127.0.0.1:8088"
#define FILE_NAME ""
/***********************************************
*** get_file_size
*** 功能:获取文件的大小
*** 描述:通过该函数获取需要上传文件的大小
*** 参数:
*** 返回:-1 -- 获取失败
*** else -- 返回文件的大小
***********************************************/
unsigned long get_file_size(const char *fileName)
{
unsigned long filesize = -1;
struct stat statbuff;
if(stat(fileName, &statbuff) < 0)
{
return filesize;
}
else
{
filesize = statbuff.st_size;
}
return filesize;
}
size_t write_func(void *buffer,size_t size,size_t nmemb,void *stream)
{
printf("recv:%s\n",(char *)buffer);
return size*nmemb;
}
/***********************************************
*** sendPostFile
*** 功能:发送http请求
*** 描述:通过读取文件的方式发送消息请求
*** 参数:fileName -- 待读取文件的名字
*** hostname -- 需要请求的域名
*** header -- 请求头
*** 返回:-1 -- 请求失败
*** 0 -- 请求成功
***********************************************/
int sendPostFile(const char *fileName,const char *hostname,const char *header)
{
char recv[100]={0};
CURL *curl;
CURLcode res;
char filesize[15]={0};
struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL;
//static const char buf[] = "Expect:";
curl_global_init(CURL_GLOBAL_ALL);
sprintf(filesize, "%lu", get_file_size(fileName));
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "logFile",
CURLFORM_FILE, fileName,
CURLFORM_CONTENTTYPE, "application/GWLog",
CURLFORM_END);
curl = curl_easy_init();
headerlist = curl_slist_append(headerlist, header);
if (curl)
{
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, hostname);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
// 设置回调函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
{
printf("curl url_easy_perform() failed:%s \n",curl_easy_strerror(res));
return -1;
}
else
{
long responseCode = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);
if (responseCode < 200 || responseCode >= 300)
{
printf("responseCode:%ld\n",responseCode);
return -1;
}
}
/* always cleanup */
curl_easy_cleanup(curl);
/* then cleanup the formpost chain */
curl_formfree(formpost);
/* free slist */
curl_slist_free_all (headerlist);
}
return 0;
}
/***********************************************
*** sendPostData
*** 功能:发送http请求
*** 描述:通过直接传字符串的方式发送消息请求
*** 参数:fileName -- 待读取文件的名字
*** hostname -- 需要请求的域名
*** 返回:-1 -- 请求失败
*** 0 -- 请求成功
***********************************************/
int sendPostData(char *data,char *dataName,char *hostname)
{
char recv[100]={0};
CURL *curl;
CURLcode res;
long namelength = strlen(dataName);
struct curl_httppost *formpost=NULL;
struct curl_httppost *lastptr=NULL;
struct curl_slist *headerlist=NULL;
static const char buf[] = "Expect:";
curl_global_init(CURL_GLOBAL_ALL);
curl_formadd(&formpost,
&lastptr,
CURLFORM_PTRNAME, dataName,
CURLFORM_PTRCONTENTS, data,
CURLFORM_NAMELENGTH, namelength,
CURLFORM_END);
curl = curl_easy_init();
headerlist = curl_slist_append(headerlist, buf);
if (curl)
{
// 设置超时时间为1秒
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2);
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, hostname);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)recv);
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
{
printf("curl url_easy_perform() failed:%s \n",curl_easy_strerror(res));
return -1;
}
else
{
printf("recv:%s\n",recv);
}
/* always cleanup */
curl_easy_cleanup(curl);
/* then cleanup the formpost chain */
curl_formfree(formpost);
/* free slist */
curl_slist_free_all (headerlist);
}
return 0;
}
#if 1
int main(int argc,char *argv[])
{
char *fileName = "";
char *hostname = "127.0.0.1:8088";
char *header = "Content-Type:application/json;charset=UTF-8";
int ret = sendPostFile(fileName,hostname,header);
if (ret == -1)
{
printf("sendPostFile failed\n");
return -1;
}
else
printf("sendPostFile success\n");
return 0;
}
#endif