libcurl 库的使用 利用libcurl 发送https请求,接受数据不全问题

大宝 2009-04-29 09:46:35
在做一个利用https发送请求和接受返回数据的dll,遇到这样一个问题,头疼1天了,竟然没找到原因,情况大概如下:

当接收数据不是很大时候,可以正常工作,比如2K或者几百字节时候正常,一旦大于4K或者更大时候,返回数据就不全了,代码大致如下:



size_t write_data(void *buffer, size_t size, size_t nmemb, void *stream) {

strcpy(((char*) stream),(char *)buffer);
return nmemb*size;

}


TRY{

/********************************************/
CString tmpResult="";
CURL *curl;
CURLcode res;
char m_Result[BUFSIZE]= "";
memset(m_Result,0,sizeof(m_Result));
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, strHttp);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&m_Result);
// curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);//调试信息打开
res = curl_easy_perform(curl);

if (res != CURLE_OK) {
strcpy(resulttmp,returnerror);
FILE *fp=fopen(TcFilePath+"\\"+"changpssTmp.xml","w");
fwrite(returnerror,returnerror.GetLength(),1,fp);
fclose(fp);
return resulttmp;
}
curl_easy_cleanup(curl);

}

/****************************************/
Texttmp = m_Result; //接受功则把字符串复制给Texttmp 但此时接受长度不够
strcpy(resulttmp,Texttmp);
FILE *fp=fopen(TcFilePath+"\\"+"changpssTmp.xml","w");
fwrite(Texttmp,Texttmp.GetLength(),1,fp);
fclose(fp);
*/
}


CATCH_ALL(e)
{
strcpy(resulttmp,returnerror);
FILE *fp=fopen(TcFilePath+"\\"+"changpssTmp.xml","w");
fwrite(returnerror,returnerror.GetLength(),1,fp);
fclose(fp);
return resulttmp;
}
END_CATCH_ALL

/***********************应该接受内容***************************************/

<?xml version="1.0" encoding="UTF-8"?><result><point>2400</point><status-code>00</status-code><coupon-list><coupon><coupon-id>03cc98f2bd3643d5a6cc44201a3c382a</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>04b249ab3ed74cdc8a98054c521a1aae</coupon-id><name>98元生日蛋糕卷
</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-
.
.
.
.
.
.
04</end-date></coupon><coupon><coupon-id>fda79c0e3b6c4e7e82a079c66a698beb</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>fde28e58c5934992be86842733d741cc</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon></coupon-list><prepay>0</prepay><need-password>no</need-password><customer-grade>VIP会员</customer-grade><card-num>0010650000000077</card-num></result>

/*******************实际接收内容**************************/

mited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>d0d483d614a24cbc80ff206888190915</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>d2888a5d99d84e72924d21e4f36ae36c</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>d2e396f1e92d484a84d323170d620509</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>d50139dbf36e409b9c5ad98ab2fc97fc</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>de496b5bbf0a4874a0bc832d241030d6</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>ded3241227304c02b6c679410a852bc8</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>dfa8c0dadc5e4ad3ad7849b2795ad433</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>e06e58e72eaf48359ab3602793f27641</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>eb5b55f4a6df4e73992f96148eecc216</coupon-id><name>98元生日蛋糕卷
.
.
.
.
.
.
</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>fda79c0e3b6c4e7e82a079c66a698beb</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon><coupon><coupon-id>fde28e58c5934992be86842733d741cc</coupon-id><name>98元生日蛋糕卷</name><money>9800</money><available>yes</available><limited-money>10000</limited-money><end-date>2010-09-04</end-date></coupon></coupon-list><prepay>0</prepay><need-password>no</need-password><customer-grade>VIP会员</customer-grade><card-num>0010650000000077</card-num></result>回车符
回车符
回车符
//内容为最后3708个字节 加三个回车符
//这是什么原因呢?大家有没有遇到相同问题,谢谢指教!




...全文
2144 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxl2004069 2012-06-06
  • 打赏
  • 举报
回复
size_t WriteFunc(char *data, size_t size, size_t nmemb, string *writerData)
{
if (writerData == NULL)
return 0;
size_t len = size*nmemb;
writerData->append(data, len);

return len;
}
sephixiao 2011-08-11
  • 打赏
  • 举报
回复
我强烈地顶楼主
manInTheWind 2009-12-16
  • 打赏
  • 举报
回复

size_t curlHttp::writeData(char *ptr,size_t size,size_t nmemb,string *stream)
{

stream->append(ptr,size*nmemb);
return size;
}



curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&m_Result);
m_Result 返回的数据也是不全.
但用文件保存返回数据倒是全的.

manInTheWind 2009-12-16
  • 打赏
  • 举报
回复
我用的是http取数据,代码和你类似,也是不全
大宝 2009-05-08
  • 打赏
  • 举报
回复
问题解决了 方法:将write_data函数改为:


size_t write_data(void *buffer, size_t size, size_t nmemb, void *stream)
{
char httpsBuffer[20480];
memset (httpsBuffer,0,sizeof(httpsBuffer));
memcpy(httpsBuffer,buffer,nmemb);
httpsResult = httpsResult+httpsBuffer;
// int written = fwrite(buffer, size, nmemb, (FILE *)fptmp);
return nmemb*size;
}

其中 httpsReult为全局
static CString httpsResult;
大宝 2009-05-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 baiwei156 的回复:]
感觉是缓存的问题
[/Quote]
貌似没有关系吧
大宝 2009-05-05
  • 打赏
  • 举报
回复
郁闷 暂时没有正解。。。。。。。。。。。。。。。。。大家帮忙顶顶吧!
liliangbao 2009-05-01
  • 打赏
  • 举报
回复
帮顶吧!!!
eyun221 2009-04-30
  • 打赏
  • 举报
回复
不清楚,帮顶一下!!
jame2001 2009-04-29
  • 打赏
  • 举报
回复
以下函式中不應該以strcpy來做資料複製, 改用memcpy


size_t write_data(void *buffer, size_t size, size_t nmemb, void *stream) {

//strcpy(((char*) stream),(char *)buffer);
memcpy((char*) stream, (char *)buffer, nmemb*size);
return nmemb*size;

}

baiwei156 2009-04-29
  • 打赏
  • 举报
回复
感觉是缓存的问题

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧