问题1、下面代码是通过http://www.ip138.com/,根据IP查找所在地区的,可是程序会挂掉,请高手指教?void PostForm()
{
CInternetSession  session("My Session");         
CHttpConnection *pServer = NULL;         
CHttpFile *pFile = NULL;         
CString ServerName = "www.ip138.com";         
INTERNET_PORT nPort = 80;         
DWORD retcode;         
char  outBuff[1024] = {0};
char IP[] = "www.baidu.com";
sprintf(outBuff, "ip=%s&action=2", IP);
try         
{         
pServer = session.GetHttpConnection(ServerName,nPort);         
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,"ips8.asp",NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT);         
pFile->AddRequestHeaders("Content-Type:application/x-www-form-urlencoded");         
pFile->AddRequestHeaders("Accept:*/*");         
pFile->SendRequest(NULL,0,outBuff,strlen(outBuff)+1);         
pFile->QueryInfoStatusCode(retcode);         

DWORD dwlen=pFile->GetLength();         
char  *buf = new char[dwlen];         
DWORD  dwread=pFile->Read(buf,1024);//下一步就死了
printf("%s\n", buf);
delete []buf;   
}         
catch (CInternetException e)
{
printf("Error Occur!\n");
}    
delete pFile;         
delete pServer;         
session.Close();         

}
问题2、怎么在下面代码的基础上改为用GET方式提交?//computer.jsp功能为根据三角形三边求面积
void PostForm()
{
CInternetSession  session("My Session");         
CHttpConnection *pServer = NULL;         
CHttpFile *pFile = NULL;         
CString ServerName = "127.0.0.1";         
INTERNET_PORT nPort = 8080;         
DWORD retcode;         
char  outBuff[] = "sideA=3&sideB=4&sideC=5";//三角形三边
try         
{         
pServer = session.GetHttpConnection(ServerName,nPort);         
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,"computer.jsp",NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT);         
pFile->AddRequestHeaders("Content-Type:application/x-www-form-urlencoded");         
pFile->AddRequestHeaders("Accept:*/*");  
pFile->SendRequest(NULL,0,outBuff,strlen(outBuff)+1);         
pFile->QueryInfoStatusCode(retcode);         

DWORD dwlen=pFile->GetLength();         
char  *buf = new char[dwlen];         
DWORD  dwread=pFile->Read(buf,1024);
printf("%s\n", buf);
delete []buf;   
}         
catch (CInternetException e)
{
AfxMessageBox("Error Occur!");
}    
delete pFile;         
delete pServer;         
session.Close();         

}

解决方案 »

  1.   

    catch的时候  
    catch (CInternetException* e)
    {
        e->ReportError();
        e->Delete();
    }
      

  2.   

    GET函数 
    /**********************************************************************************
    *函数名称: GetMethld
    *功能说明: Get方式发送请求
    *参数列表: strURL : 带有GET请求的地址
    *  strHTML : 返回的页面的HTML代码
    **********************************************************************************/
    BOOL SimSearch::GetMethld(CString strURL , CString& strHTML)
    {
    try
    {
    BOOL bRet = FALSE; CInternetSession   mySession(NULL,0);  
    CHttpFile*   pFile=NULL;   CString   strSentence;   //strSentence.Format("%d",db pFile=(CHttpFile*)mySession.OpenURL(strURL);  
    DWORD dwStatus;
    DWORD dwBuffLen = sizeof(dwStatus);
    BOOL bSuccess = pFile->QueryInfo(
    HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
    &dwStatus, &dwBuffLen); if( bSuccess && dwStatus>=  200 && dwStatus<300) 
    {
    char buffer[1024*56];
    memset(buffer, 0, 1024*56);
    int nReadCount = 0;
    while((nReadCount = pFile->Read(buffer, 1024*56)) > 0)
    {
    strHTML += buffer;
    memset(buffer, 0, 1024*56);
    }
    bRet = TRUE;
    }
    else //有错误 记录日志
    {
    bRet = FALSE;
    }
    pFile->Close();
    mySession.Close();
    return bRet;
    }
    catch(CInternetException* e)
    {
    CString strError;
    InternetErrorOccurHandler(e , strError);
    //s_ErrorLog.WriteLogWithTime(strError);
    return FALSE;
    }
    }POST函数
    /**********************************************************************************
    *函数名称: PostDataBase
    *功能说明: 满足部分基础的Post数据提交  -- 即  不用AddRequest增加特殊的请求头
    *参数列表: strURL : Post提交的链接地址
    *  strPostData : 需要提交的数据内容
    *  strHTML : 提交后返回的HTML代码
    **********************************************************************************/
    BOOL SimSearch::PostDataBase(CString strURL , CString strPostData , CString& strHTML)
    {
    try
    {
    BOOL bRet;
    CString strServer, strObject, strHeader, strRet;
    unsigned short nPort;
    DWORD dwServiceType;
    if(!AfxParseURL(strURL, dwServiceType, strServer, strObject, nPort))
    return FALSE; CInternetSession sess; //创建会话 CHttpFile* pFile;
    //////////////////////////////////////////////
    CHttpConnection *pServer = sess.GetHttpConnection(strServer, nPort); 
    if(pServer == NULL)
    return FALSE; pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,strObject,NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT); 
    if(pFile == NULL)
    return FALSE; pFile -> AddRequestHeaders("Content-Type: application/x-www-form-urlencoded"); 
    pFile -> AddRequestHeaders("Accept: */*"); 
    pFile -> SendRequest(NULL, 0, (LPTSTR)(LPCTSTR)strPostData, strPostData.GetLength());  CString strSentence;
    DWORD dwStatus;
    DWORD dwBuffLen = sizeof(dwStatus);
    BOOL bSuccess = pFile->QueryInfo(
    HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER,
    &dwStatus, &dwBuffLen); if( bSuccess && dwStatus>=  200 && dwStatus<300) 
    {
    char buffer[1024*56];
    memset(buffer, 0, 1024*56);
    int nReadCount = 0;
    while((nReadCount = pFile->Read(buffer, 1024*56)) > 0)
    {
    strHTML += buffer;
    memset(buffer, 0, 1024*56);
    }
    bRet = TRUE;
    }
    else
    {
    bRet = FALSE;
    } ////////////////////////////////////////
    pFile->Close();
    sess.Close();
    return bRet;
    }
    catch(...)
    {
    int nCode = GetLastError();
    return FALSE;
    }
    }
      

  3.   

    POST函数的catch部分写得很随意(自己写的  有时候马虎了一点)  你可以把我上面的catch部分copy过去 
      

  4.   

    非常感谢liplj,你的两段程序基本都能满足功能要求
    但是用http://alexa.chinaz.com/?domain=www.baidu.com测试时返回以下消息
    <script language="javascript">alert("您已经被禁止使用我们的查询服务。\n\n有任何
    疑问请联系 QQ 7679512!");window.location.href("/Index.asp");</script>
    问题2中我的意思是在原代码的基础上修改,使用OpenRequest函数(参数用CHttpConnection::HTTP_VERB_GET)进行表单提交
      

  5.   

    问题2中  要使用GET提交 其实就是将参数组织到URL中 比如 http://127.0.0.1/页面地址.html?sideA=3&sideB=4&sideC=5   然后将URL直接传递给我的GET函数  就行了  利用简单的OpenURL就可以实现了东西 为什么要利用繁杂的OpenRequest? 我这人爱偷懒 . 
    具体东西还是抓包吧  按照你抓获的IE的HTTP封包自己组包 发送  不是什么难事