比如想发送登录数据对user=admin passwd=123456?

解决方案 »

  1.   

    给你一个例子:BOOL CConnectorDlg::DoConnect(CConnectorDlg * pConnectorDlg)
    {
    CHAR szReceiveBuffer[HTTP_BUFFER_SIZE]; CInternetSession cInternetSession;
    CHttpConnection * pHttpConnection = cInternetSession.GetHttpConnection(_T("210.21.200.43"), (INTERNET_PORT)80);
    CHttpFile * pHttpFile = pHttpConnection->OpenRequest(0, _T("/cgi-bin/authcgi_login"));
    LPSTR lpOptions = "act=login&user=Carapee&passwd=shit";
    pHttpFile->SendRequest(NULL, 0, lpOptions, strlen(lpOptions));
    pHttpFile->Read(szReceiveBuffer, HTTP_BUFFER_SIZE);
    cInternetSession.Close(); return TRUE;
    }
      

  2.   

    运行时服务器检测不到POST方法发送的变量,请看看什么原因?
    CHAR szReceiveBuffer[36000];
    memset(szReceiveBuffer,0,36000); CInternetSession cInternetSession;
    CHttpConnection * pHttpConnection = cInternetSession.GetHttpConnection(_T("127.0.0.1"), (INTERNET_PORT)80);
    CHttpFile * pHttpFile = pHttpConnection->OpenRequest(0, _T("/test.asp"));
    LPSTR lpOptions = "act=login&user=Carapee&passwd=shit";
    pHttpFile->SendRequest(NULL, 0, lpOptions, strlen(lpOptions));
    pHttpFile->Read(szReceiveBuffer, 36000);
    MessageBox(szReceiveBuffer);
    cInternetSession.Close(); return ;服务器端的ASP文件内容如下:
    <%=request.form("user")%>
      

  3.   

    通过WinInet API来实现表单提交的工作     这种方法实现代码量很少,而且由于不需要下载太多的无用数据(如图片等),form所在的页面也不需要下载,所以效率要高得多,另外实现代码是一个函数,很适合用在线程中。
        用这种方法关键是要知道应该给服务器提交些什么数据如果自己去看网页文件,然后分析应该向服务器提交什么数据,网页很简单时还差不多,如果网页很复杂,那就属于费力不讨好的事。现在不是考试,那种事情我们就不做了,现在有一个更简单的办法,就是用Win2000下的网络监视器,手工投一票看看向服务器提交了些什么数据。这样我们就可以把那数据中属于HTTP协议的部分Copy下来。直接从监视器里拷出来的数据是没法用的,因为监视器显示文本的部分把回车换行之类的字符都用小数点代替了,这些部分要先改回原来的回车、换行(HTTP头部分的就可以不用管了,只要你能分清边界就可以了)。另外注意,提交信息中可能会有Content-Length这个信息,如果你修改了提交数据的内容,而且数据长度发生了变化,Content-Length项的值一定要跟着改。比如Content-Length原来的值是100,数据中有一条数据“1”,你现在改成了“12”,则Content-Length一定要改成101,否则服务器会返回错误。 下面列出的就是投票函数:
    UINT Vote(LPVOID)
    {
        CInternetSession session;
        theApp.m_nThreads++; //用来记录投票线程数的
        try
        {
            CHttpConnection* pConnection =session.GetHttpConnection("www.onlytest.net"); //网站服务器
            CHttpFile* pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,"vote2.asp"); //直接向投票处理页面提交数据
            //下面向提交数据中添加HTTP头,这些可以由网络监视器得到
            pFile->AddRequestHeaders("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
            pFile->AddRequestHeaders("Referer: http://www.onlytest.net/vote.htm");
            pFile->AddRequestHeaders("Accept-Language: zh-cn");
            pFile->AddRequestHeaders("Content-Type: multipart/form-data; boundary=---------------------------7d11dc24268052c");
            pFile->AddRequestHeaders("Accept-Encoding: gzip, deflate");
            pFile->AddRequestHeaders("User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
            pFile->AddRequestHeaders("Content-Length: 1351");
            pFile->AddRequestHeaders("Connection: Keep-Alive");
            pFile->AddRequestHeaders("Cache-Control: no-cache");
            //HTTP头后面就应该是真正的数据了,下面theApp.m_strFormData中就是要提交的数据,服务器处理返回的信息在pFile中
            pFile->SendRequest(NULL,0,theApp.m_strFormData.GetBuffer(0),theApp.m_strFormData.GetLength()); //提交所有数据
            //其实到这里投票已经可以结束了,不过你如果想看看成果,完全可以把返回的页面分析分析,得到些数据
            char szBuffer[11001]; //用来存放返回的处理页面,要多大看实际情况。当然也可以动态分配,不嫌累的话
            int nLen=pFile->Read(szBuffer,11000);//读取返回的内容,其实是投票结果页面的HTML代码
            szBuffer[nLen]=0;
            CString strTemp=szBuffer; //CString虽然滥了些,但用着就是方便,嘿嘿~
            pFile->Close(); //数据读出来后把该关闭的东西都关掉
            pConnection->Close();
            delete pFile;
            delete pConnection;
            session.Close();
            //下面的代码就是用来分析HTML代码来得到你感兴趣的数据了,和投票没什么关系,就不详细解释了
            int nPos=strTemp.Find("选项A"); 
            int nTempPos=nPos;
            if(nPos==-1)
            {
                theApp.m_nThreads--;
                return 0;
            }
            nPos=strTemp.Find("table width=100><tr><td align=right>",nPos)+36;
            int nEndPos=strTemp.Find("票",nPos);
            m_nOurNum=atoi(strTemp.Mid(nPos,nEndPos-nPos));
            nPos=strTemp.Find("<tr bgcolor=#DEE6EB><td align=center width=50>1</td>");
            nPos=strTemp.Find("table width=100><tr><td align=right>",nPos)+36;
            nEndPos=strTemp.Find("票",nPos);
            m_nDiff=atoi(strTemp.Mid(nPos,nEndPos-nPos))-m_nOurNum;
            m_nVote++;
        }
        catch(...)
        {
        }
        theApp.m_nThreads--;
        return 0;