HttpSendRequest调用,一个奇怪的错误

yueyinjianxian 2011-08-10 03:11:12
HttpSendRequest没隔1分钟调用一次,前几次还能正常发送post,具体几次之后记不清了,最多不超过5次,然后再调用就一直失败了
...全文
274 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
一叶之舟 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yueyinjianxian 的回复:]
引用 10 楼 dahuaixiaohuai 的回复:
每一次调用
InternetOpen
InternetConnect
是不是要释放资源的。

怎释放
[/Quote]
恭喜你,呵呵,我不熟悉你用的技术,不知道你应该使用什么样的函数去释放资源,只是觉得你创建了连接,应该释放连接,否则资源释放不了就会出问题。
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
问题解决了,就是没有释放句柄,准备接分,贴出源码:
int post_http(string servername, string action, string sDate)
{
HINTERNET hSession = InternetOpen( (LPCSTR)"SMZM SPEEDER",INTERNET_OPEN_TYPE_PRECONFIG,NULL,
NULL, 0);
if(!hSession)
{
printf("Failed to open session\n");
return 1;
}
HINTERNET hConnect = InternetConnect(hSession, (LPCSTR)servername.c_str(),INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP,0,0);
if (!hConnect)
{
printf( "Failed to connect\n" );
InternetCloseHandle(hSession);
return 2;
}
HINTERNET hRequest = HttpOpenRequest(hConnect, (LPCSTR)"POST", (LPCSTR)action.c_str(),
NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
if (!hRequest)
{
printf( "Failed to open request handle\n" );
InternetCloseHandle(hSession);
InternetCloseHandle(hConnect);
return 3;
}
char headerLanguage[] = "Accept-Language: en-us\r\n";
char headerEncoding[] = "Accept-Encoding: gzip, deflate\r\n";
char headerContentType[] = "Content-Type: application/x-www-form-urlencoded";
char headerContentLength[64];
sprintf(headerContentLength, "Content-Length: %d\r\n", sDate.length());

HttpAddRequestHeaders(hRequest, headerLanguage, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, headerEncoding, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, headerContentType, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, headerContentLength, -1, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE);



/*BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur
BufferIn.Next = NULL;
BufferIn.lpcszHeader = NULL;
BufferIn.dwHeadersLength = 0;
BufferIn.dwHeadersTotal = 0;
BufferIn.lpvBuffer = NULL;
BufferIn.dwBufferLength = 0;
BufferIn.dwBufferTotal = strlen(sDate.c_str()); // This is the only member used other than dwStructSize
BufferIn.dwOffsetLow = 0;
BufferIn.dwOffsetHigh = 0;*/


if(!HttpSendRequest( hRequest, NULL, 0, (LPVOID)sDate.c_str(), sDate.length()))
{
printf( "Failed to open HttpSendRequest handle\n" );
InternetCloseHandle(hSession);
InternetCloseHandle(hConnect);
InternetCloseHandle(hRequest);
return 4;
}

/*char* backbuf[1024];
if(!InternetReadFile(hRequest, backbuf, sizeof(backbuf), NULL))
{
return 5;
}*/
InternetCloseHandle(hSession);
InternetCloseHandle(hConnect);
InternetCloseHandle(hRequest);

return 6;
}
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
我估计就是没有释放句柄,之前我写get方法是及时释放句柄了,就没事,这回写的急,领导催着要忘了释放句柄了
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 luciferisnotsatan 的回复:]
int sprintf(
char *buffer,
const char *format [,
argument] ...
);
不认识std::string是个什么东西
[/Quote]
嗯,我已经改用char *了,取得的是乱码,打印出来是?
luciferisnotsatan 2011-08-10
  • 打赏
  • 举报
回复
int sprintf(
char *buffer,
const char *format [,
argument] ...
);
不认识std::string是个什么东西
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dahuaixiaohuai 的回复:]
每一次调用
InternetOpen
InternetConnect
是不是要释放资源的。
[/Quote]
怎释放
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luciferisnotsatan 的回复:]
sprintf( error,"Error on HttpSendRequest %d\n",GetLastError() );
这个error是什么?空间够不够?
[/Quote]
string啊,少贴出来一句
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luciferisnotsatan 的回复:]
sprintf( error,"Error on HttpSendRequest %d\n",GetLastError() );
这个error是什么?空间够不够?
[/Quote]
string啊,少贴出来一句
至善者善之敌 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yueyinjianxian 的回复:]
引用 4 楼 luciferisnotsatan 的回复:
失败,那报什么错呢?

没取得错误信息,比较笨,取错误信息时老是提示内存错误
[/Quote]

有没有NEW内存?
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
丫的取到个?,算了,不取了,太费劲了,刚刚我加了internetreadfile函数,已经10多分钟了,还没报错,观望一下
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
好,我再试试,不过你得等会了,要再现这个错误是需要时间的。俺用的就是GetLastError啊
一叶之舟 2011-08-10
  • 打赏
  • 举报
回复
每一次调用
InternetOpen
InternetConnect
是不是要释放资源的。
luciferisnotsatan 2011-08-10
  • 打赏
  • 举报
回复
sprintf( error,"Error on HttpSendRequest %d\n",GetLastError() );
这个error是什么?空间够不够?
luciferisnotsatan 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yueyinjianxian 的回复:]

引用 4 楼 luciferisnotsatan 的回复:
失败,那报什么错呢?

没取得错误信息,比较笨,取错误信息时老是提示内存错误
[/Quote]

HttpSendRequest失败,GetLastError获取错误码。GetLastError这个函数不可能会出内存错误呀。

yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
来个大侠分析分析代码吧,代码很简单的,在线等啊
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luciferisnotsatan 的回复:]
失败,那报什么错呢?
[/Quote]
没取得错误信息,比较笨,取错误信息时老是提示内存错误
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
是不是因为没有调用internetreadfile函数,导致接收缓冲区满了呢,可是那样最多就是返回信息丢失啊,而卧对返回信息是不感兴趣的,应该没什么影响吧
luciferisnotsatan 2011-08-10
  • 打赏
  • 举报
回复
失败,那报什么错呢?
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
怎么没人回答呢,分不够吗?分不少了啊,up下
yueyinjianxian 2011-08-10
  • 打赏
  • 举报
回复
在线等,分不够可以加
加载更多回复(1)

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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