Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用wininet+;_C++_Wininet - Fatal编程技术网

C++ 在C+中使用wininet+;

C++ 在C+中使用wininet+;,c++,wininet,C++,Wininet,我有一个服务器,如果我发送它”https://MyDomain/Dir1/Dir2/login.html?u=1234&t=5678“将使用xml文档进行响应。有人知道我如何在wininet中做到这一点吗 以下是我迄今为止所做的工作: std::string GetLoginData(void) { HINTERNET hInternet, hConnection, hRequest; std::string retVal; hInternet = InternetOp

我有一个服务器,如果我发送它”https://MyDomain/Dir1/Dir2/login.html?u=1234&t=5678“将使用xml文档进行响应。有人知道我如何在wininet中做到这一点吗

以下是我迄今为止所做的工作:

std::string GetLoginData(void)
{
    HINTERNET hInternet, hConnection, hRequest;
    std::string retVal;

    hInternet = InternetOpen(L"My Application", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if(NULL != hInternet)
    {
        hConnection = InternetConnect(hInternet, L"MyDomain", INTERNET_DEFAULT_HTTPS_PORT, L"", L"", INTERNET_SERVICE_HTTP, 0, NULL);
        if(NULL != hConnection)
        {
            const wchar_t* lplpszAcceptTypes[] = {L"text/xml", L"application/xml", L"application/xhtml+xml", NULL};

            hRequest = HttpOpenRequest(hConnection, L"GET", L"Dir1/Dir2/Login.html", NULL, NULL, lplpszAcceptTypes,
                INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
                INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_KEEP_CONNECTION |
                INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_UI | INTERNET_FLAG_PRAGMA_NOCACHE, 0);
            if(NULL != hRequest)
            {
                const char Params[] = {"u=1234&t=5678"};

                BOOL rc = HttpSendRequest(hRequest, NULL, 0, (void*)Params, strlen(Params));

                if(rc) // here rc = 0 and GetLastError() returns 12152
                {
                    DWORD availDataLen;
                    char Buff[4096];
                    DWORD readCount = ERROR_INTERNET_CONNECTION_RESET;

                    InternetQueryDataAvailable(hInternet, &availDataLen, 0, 0);
                    while(0 < availDataLen)
                    {
                        InternetReadFile(hInternet, Buff, min(sizeof(Buff), availDataLen), &readCount);
                        availDataLen -= readCount;
                        retVal = retVal + Buff;
                    }
                }
                InternetCloseHandle(hRequest);
            }
            InternetCloseHandle(hConnection);
        }
        InternetCloseHandle(hInternet);
    }
    return retVal;
}
std::字符串GetLoginData(void)
{
HINTERNET HINTERNET,hConnection,hRequest;
std::字符串检索;
hInternet=InternetOpen(L“我的应用程序”,INTERNET\u OPEN\u TYPE\u DIRECT,NULL,NULL,0);
如果(空!=hInternet)
{
hConnection=InternetConnect(hInternet,L“MyDomain”,INTERNET\u默认\u HTTPS\u端口,L“”,L“”,INTERNET\u服务\u HTTP,0,空);
if(NULL!=hConnection)
{
const wchar_t*lplpszAcceptTypes[]={L“text/xml”,L“application/xml”,L“application/xhtml+xml”,NULL};
hRequest=HttpOpenRequest(hConnection,L“GET”,L“Dir1/Dir2/Login.html”,NULL,NULL,lpszAcceptTypes,
互联网标志不缓存互联网标志忽略证书无效互联网标志忽略证书日期无效|
互联网标志忽略重定向到HTTP互联网标志忽略重定向到HTTPS互联网标志保持连接|
互联网|互联网|标志|认证|互联网|标志|标签|标签| 0 |);
如果(NULL!=hRequest)
{
常量字符参数[]={“u=1234&t=5678”};
BOOL rc=HttpSendRequest(hRequest,NULL,0,(void*)参数,strlen(参数));
if(rc)//这里rc=0,GetLastError()返回12152
{
德沃德·阿瓦尔达伦;
字符Buff[4096];
DWORD readCount=错误\互联网\连接\重置;
InternetQueryDataAvailable(hInternet和availDataLen,0,0);
而(0
但是正如您在代码中所看到的那样,HttpSendRequest()失败并且
GetLastError()
返回12152

先谢谢你
Sam

这是错误\u WINHTTP\u无效\u服务器\u响应。最好是在HTTPS端口上发出HTTP请求

我不太了解API,但看起来您需要将INTERNET\u FLAG\u SECURE添加到调用中,和/或在调用的flags参数中:

互联网标志安全
使用安全事务语义。这转化为使用安全套接字层/专用通信技术(SSL/PCT),并且仅在HTTP请求中有意义。HttpOpenRequest和InternetOpenUrl使用此标志,但如果URL中出现https://则此标志是多余的;在此连接下创建的所有请求句柄都将继承此标志


INTERNET\u标志\u SECURE
添加到
HttpOpenRequest
对我来说很有效

HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, lpszVerb, lpszObjectName, 0, 0, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE, 0);