Http post - 发送大数据vc ++时连接重置

时间:2013-01-30 06:29:34

标签: c++ http visual-c++ mfc connection

My Code需要使用vc ++将xml数据发布到服务器,使用CInternetSession作为post,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");
    }
}

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

1 个答案:

答案 0 :(得分:1)

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

查看CInternetSession::OpenURLCHttpFile的文档,很明显您无法使用OpenURL。它无法让您指定(作为文档调用它)动词用于您的HTTP请求。

您将不得不想办法使用HttpOpenRequest函数。这看起来更加复杂,因为您必须自己选择URL到其组件部分。也许这个库有一些很好的URL解析函数可以用来做这个。

我必须说这是一个非常糟糕的图书馆。