HInternet只能工作一次
HInternet works only one time
这段代码是在一个注入到游戏中的c++ DLL中。(这是在私人服务器上,所以它是合法的)。代码必须执行多次。然而,它只在第一次有效。它可能是在WCF端,但我设法从之前从c++ dll加载的。net dll发送了2和5个成功的请求。
因为我不知道为什么它被阻止后2和5个请求,我决定去所有本地,但现在我被阻止后一个请求。我现在有一种感觉,这与我解析响应的方式有关。
第一次执行的代码状态为200,第二次执行的代码状态为0。
编辑:my firewall is off.
HINTERNET hInternet = InternetOpen(_T("MyApp"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hInternet, _T("localhost"), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
LPCSTR rgpszAcceptTypes[] = { _T("application/json"), NULL };
HINTERNET hRequest = HttpOpenRequest(hConnect, _T("POST"), _T("/xxxBackend/service1.svc/SaveDataVoid"), NULL, NULL, rgpszAcceptTypes, 0, 0);
HttpAddRequestHeaders(hRequest, _T("Content-Type: application/jsonrn"), -1, HTTP_ADDREQ_FLAG_ADD);
char *JsonData = "{"data":{"AccountName":"","CharName":"SilverDeth-IV","GameDiff":"1","CompressedData":[8228138568842941382,8247906688399250381,8244242016143283142]}}";
HttpSendRequest(hRequest, NULL, 0, JsonData, strlen(JsonData));
DWORD StatusCode = 0;
DWORD StatusCodeLen = sizeof(StatusCode);
HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &StatusCode, &StatusCodeLen, NULL);
if (StatusCode == 200)
{
char *lpBuffer[2000];
DWORD lpdwNumberOfBytesRead = 0;
InternetQueryDataAvailable(hRequest, &StatusCodeLen, 0, 0);
bool bRetval = InternetReadFile(hRequest, lpBuffer, 2000, &lpdwNumberOfBytesRead);
}
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
您所展示的代码根本不做任何错误处理。将其添加进去,然后查看故障真正发生的位置。StatusCode
为0的事实意味着HttpQueryInfo()
失败,如果您一开始没有获得有效的hRequest
,就可能发生这种情况。
BTW, rgpszAcceptTypes
需要声明为LPCTSTR
而不是LPCSTR
,您应该使用TEXT()
宏而不是_T()
宏。TEXT()
属于Win32 API,但_T()
属于C运行时库,您在此代码中没有使用。
试试这个:
void InetError(LPCTSTR msg)
{
DWORD dwErr = GetLastError();
if (dwErr == ERROR_INTERNET_EXTENDED_ERROR)
{
DWORD dwInetErr = 0;
LPTSTR szResp = NULL;
DWORD dwLength = 0;
InternetGetLastResponseInfo(&dwInetErr, NULL, &dwLength);
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
szResp = new TCHAR[dwLength+1];
InternetGetLastResponseInfo(&dwInetErr, szResp, &dwLength);
}
// use msg, szResp, and dwInetErr as needed...
delete[] szResp;
}
else
{
// use msg and dwErr as needed...
}
}
...
HINTERNET hInternet = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
hInternet = InternetOpen(TEXT("MyApp"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (!hInternet)
{
InetError(TEXT("InternetOpen failed"));
goto done;
}
hConnect = InternetConnect(hInternet, TEXT("localhost"), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
if (!hConnect)
{
InetError(TEXT("InternetConnect failed"));
goto done;
}
LPCTSTR rgpszAcceptTypes[] = { TEXT("application/json"), NULL };
hRequest = HttpOpenRequest(hConnect, TEXT("POST"), TEXT("/xxxBackend/service1.svc/SaveDataVoid"), NULL, NULL, rgpszAcceptTypes, 0, 0);
if (!hRequest)
{
InetError(TEXT("HttpOpenRequest failed"));
goto done;
}
if (!HttpAddRequestHeaders(hRequest, TEXT("Content-Type: application/jsonrn"), -1, HTTP_ADDREQ_FLAG_ADD))
{
InetError(TEXT("HttpAddRequestHeaders failed"));
goto done;
}
char *JsonData = "{"data":{"AccountName":"","CharName":"SilverDeth-IV","GameDiff":"1","CompressedData":[8228138568842941382,8247906688399250381,8244242016143283142]}}";
if (!HttpSendRequest(hRequest, NULL, 0, JsonData, strlen(JsonData)))
{
InetError(TEXT("HttpSendRequest failed"));
goto done;
}
DWORD StatusCode = 0;
DWORD StatusCodeLen = sizeof(StatusCode);
if (!HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &StatusCode, &StatusCodeLen, NULL))
{
InetError(TEXT("HttpQueryInfo failed"));
goto done;
}
if (StatusCode == 200)
{
BYTE Buffer[2000];
DWORD dwNumberOfBytes = 0;
DWORD dwNumberOfBytesRead = 0;
if (!InternetQueryDataAvailable(hRequest, &dwNumberOfBytes, 0, 0))
{
InetError(TEXT("InternetQueryDataAvailable failed"));
goto done;
}
if (!InternetReadFile(hRequest, Buffer, min(dwNumberOfBytes, sizeof(Buffer)), &dwNumberOfBytesRead))
{
InetError(TEXT("InternetReadFile failed"));
goto done;
}
//...
}
done:
if (hRequest) InternetCloseHandle(hRequest);
if (hConnect) InternetCloseHandle(hConnect);
if (hInternet) InternetCloseHandle(hInternet);
相关文章:
- 唤醒多个线程以在每个条件下工作一次
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- WebKit2GTK+ "page-created"扩展只工作一次
- Atmel Studio 7:ASF 库提供的 USART 中断处理程序仅在 main() 中遇到无限循环时工作一次?
- 在循环工作时,首先将两个文件读为向量,但仅次于迭代一次
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 如何在 c++ 中为我的游戏制作计时器,每 30 秒工作一次
- Cython导入只工作一次,然后会出现gcc.bat错误
- 共享/独占锁定,其中共享工作只能执行一次
- C++11:条件变量只工作一次
- 使用 std::ofstream 只能工作一次
- 为什么 _kbhit() 在 C 程序中只工作一次
- 问名字,如果错了再问一次,如果对了,继续(不工作)C++
- 在文件中插入文本只工作一次
- C++ SQLite 查询只工作一次。我的代码有什么问题?
- OpenGL:一次只能有一个FBO工作
- boost::timed_wait中的Notify条件变量只工作一次
- 加速 IOSTREAMS:output_filter只能工作一次
- 默认按钮只工作一次
- ios::right只在c++中工作一次