Libcurl在内容POST上很少崩溃
我使用libCURL库将HTTP POST命令发送到外部设备。 我有两个基本命令。 第一个告诉设备擦除设备上的当前内容,第二个发送新内容。 我使用两个相同的POST头结构/地址,唯一的区别是在“发送内容”命令期间数据的附件。 两个命令都可以正确执行:第一个擦除数据,第二个擦除数据。 然而,该程序很少(约30%的时间)在“发送内容”命令之后崩溃。 没有错误给出。 正如我之前所说,数据发送之前它不会崩溃,并且它不会一直发生,这使得它特别令人发狂。
代码附在下面。 发送程序需要从“curl_easy_perform(curl)”操作中完全退出的内容后,是否有某些内容丢失? 我对这种类型的东西仍然相当缺乏经验,并且欢迎您提供任何建议。
int fnSendContent(BMP* pbmpContent)
{
using namespace std;
int Error = 0;
CURL* curl;
CURLcode res;
struct curl_slist *headerlist=NULL;
static const char buf[] = "aaaaaaaaa";
CString str;
string sURL;
long lTimeout = 10;
//Pass image into char array so that it can be sent to VIP
ifstream fsContent;
fsContent.open("MyImage.bmp",ios_base::binary);
fsContent.seekg(0,ios::end);
long lBMP_size = fsContent.tellg();
fsContent.seekg(0,ios::beg);
char* pcContent = new char[lBMP_size];
for (int i = 0; i < lBMP_size; i++)
pcContent[i] = 'F';
bool bit = fsContent.eof();
fsContent.read(pcContent,lBMP_size);
fsContent.close();
string Content_Length = "Content-Length: " + to_string((long long)lBMP_size);
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
//Build header
headerlist = curl_slist_append(headerlist, buf);
headerlist = curl_slist_append(headerlist, "Authorization: MyAuth);
headerlist = curl_slist_append(headerlist, "Accept: MyAccept");
headerlist = curl_slist_append(headerlist, "Content-Type: image/bmp");
headerlist = curl_slist_append(headerlist, "Connection: keep-alive");
headerlist = curl_slist_append(headerlist, Content_Length.c_str());
headerlist = curl_slist_append(headerlist, "Expect: "); //Supress "Expect:" heading
//Set URL to receive POST
curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl,CURLOPT_POST, true);
curl_easy_setopt(curl, CURLOPT_HEADER, true);
curl_easy_setopt(curl,CURLOPT_TIMEOUT, lTimeout);
curl_easy_setopt(curl, CURLOPT_URL, "http://URL:Port/Command");
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, lBMP_size);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pcContent);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
//Send
res = curl_easy_perform(curl); //Crash occurs on send
CString str2(curl_easy_strerror(res));//Get Error Explanation
if(res != CURLE_OK)
{
str2.Format(_T("curl_easy_perform() failed: %s [%d]"), str2,res);
DebugOut->AddString(str2);
Error = E_SHOW_IMG;
}
curl_easy_cleanup(curl);
curl_global_cleanup();
curl_slist_free_all(headerlist);
delete[] pcContent;
return Error;
}
编辑:Daniel请求更多信息:
在我通过“curl_easy_perform(curl)”发送标题和数据之后,但在成功返回程序的其余部分之前发生崩溃。 我在VC ++中编码,只接收通用的“发生错误”。 数据收到后发生错误的事实让我觉得我并没有正确地终止命令。 下面给出一个崩溃POST命令的WireShark打印输出。
Source Destination Protocol Length Info
------------------------------------------------------------
|MySourceIP | MyDestIP | HTTP | 16438 | POST /Command|
------------------------------------------------------------
POST /Command HTTP/1.1..Host: URL:Port..Authorization: My Auth..Content-Type:
image/bmp..Accept: MyAccept..Connection: keep-alive..Content-Length: 61
494....BM6.......6...(..........
[Followed by 61,494 bytes of data ending in null]
CURLOPT_POSTFIELDSIZE_LARGE选项采用'curl_off_t'参数,但您传入'long'。
链接地址: http://www.djcxy.com/p/48891.html