1

我的代码需要使用 vc++ 将 xml 数据发布到服务器,我使用 CInternetSession 进行发布,使用 tinyxml 进行 xml。

如果我的 xml 数据约为 8 kb,则数据发布得非常好。但如果 xml 文件大小约为 15 kb,那么我会收到“与服务器的连接已重置”。

TiXmlDocument doc( "C:\\test.xml" );
bool loadOkay = doc.LoadFile();

if ( loadOkay )
{
    TiXmlPrinter printer;
    printer.SetIndent("\t");
    docs.Accept( &printer );

    docs.Print();
    CString zURLstest = printer.CStr();

    #define MAX_READ_BUFFER 102400

    CInternetSession* p_CInternetSession;
    CHttpFile* p_HttpFile;
    CStdioFile* p_File;
    char z_ResponseBuff [MAX_READ_BUFFER];
    ULONG ul_ReadLen;
    CFile cFResponce;

    p_CInternetSession = new CInternetSession(NULL,1,PRE_CONFIG_INTERNET_ACCESS,NULL,NULL,0);
    p_CInternetSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,10000);
    p_CInternetSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES, 3);

    CString zURL = "http://xxx.xxx.xxx.x/Test/TestServlet?Data=";
    CString zDWURL(zURL + zURLstest);

    p_File =  p_CInternetSession->OpenURL(zDWURL, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE);           

    AfxMessageBox(zDWURL);

    p_HttpFile = (CHttpFile*)p_File;
    ul_ReadLen = p_HttpFile->Read (z_ResponseBuff, MAX_READ_BUFFER);

    DWORD dwError;
    p_HttpFile->QueryInfoStatusCode(dwError);

    if(dwError==200)
    {
        AfxMessageBox("Data updated successfully");

        remove(c:\\test.xml");
    }
}

解决此问题的任何想法或建议

4

1 回答 1

1

这不是一个 POST,它是一个 GET 请求,所有数据都嵌入到 URL 中。由于各种原因,大多数服务器都会对 URL 长度进行限制。如果您超过此限制,服务器的响应将立即断开您的连接,因为您认为您正在尝试 DDOS 或缓冲区溢出漏洞利用。

查看CInternetSession::OpenURLCHttpFile的文档,很明显您不能OpenURL用于此。它无法让您指定(如文档所称)用于您的 HTTP 请求的动词。

您将不得不想办法改用HttpOpenRequest函数。这看起来要复杂得多,因为您必须自己将 URL 选择到其组成部分中。也许该库有一些不错的 URL 解析功能,您可以使用它来执行此操作。

我必须说这是一个设计非常糟糕的库。

于 2013-01-30T07:49:16.357 回答