HInternet只能工作一次

HInternet works only one time

本文关键字:一次 工作 HInternet      更新时间:2023-10-16

这段代码是在一个注入到游戏中的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);