本帖最后由 oyljerry 于 2013-10-23 17:29:12 编辑

解决方案 »

  1.   

    要是真是系统兼容问题还好些,就怕是其他部分影响了http通信啊?bool CProtocol::Request(const string& LoginXml, string& ResponseXml)
    {
    //初始化WinINet
    HINTERNET hInternet = InternetOpen("Testing", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); //初始化WinINet
    if (0 == hInternet)
    {
    return false;
    }
    //连接服务器
    HINTERNET hConnect;
    hConnect = InternetConnect(hInternet, m_ip.c_str(), m_port,
       NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); 
    if (0 == hConnect)
    {
    if (NULL != hInternet)
    {
    InternetCloseHandle(hInternet);
    }
    return false;
    }
    LPCTSTR lpszVerb = "POST";//m_verb.c_str();
    LPCTSTR lpszObjectName = m_path.c_str();
    LPCTSTR lpszVersion = NULL;            // Use default.
    LPCTSTR lpszReferrer = NULL;          // No referrer.
    LPCTSTR *lplpszAcceptTypes = NULL;    // Whatever the server wants to give us.
    DWORD dwOpenRequestFlags = INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
    INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
    INTERNET_FLAG_KEEP_CONNECTION |
    INTERNET_FLAG_NO_AUTH |
    INTERNET_FLAG_NO_AUTO_REDIRECT |
    INTERNET_FLAG_NO_COOKIES |
    INTERNET_FLAG_NO_UI |
    INTERNET_FLAG_RELOAD;
    DWORD dwOpenRequestContext = 0;
    //打开请求
    HINTERNET hOpenRequest = HttpOpenRequest(hConnect, lpszVerb, 
    lpszObjectName, lpszVersion, lpszReferrer, lplpszAcceptTypes,
    dwOpenRequestFlags, dwOpenRequestContext);
    if (0 == hOpenRequest)
    {
    if (NULL != hConnect)
    {
    InternetCloseHandle(hInternet);
    }
    if (NULL != hInternet)
    {
    InternetCloseHandle(hInternet);
    }
    return false;
    }
    if (!m_cookie.empty())
    {
    BOOL bAddHead = HttpAddRequestHeaders(hOpenRequest,m_cookie.c_str(),m_cookie.size(),HTTP_ADDREQ_FLAG_ADD);
    DWORD dwError = GetLastError();
    }//  DWORD t = 1000;
    //  BOOL bso = InternetSetOption(hInternet,/*INTERNET_OPTION_CONNECT_TIMEOUT*//*INTERNET_OPTION_RECEIVE_TIMEOUT*/INTERNET_OPTION_SEND_TIMEOUT, &t, 4);
    DWORD e = GetLastError();
    //发送请求
    BOOL bRequest = HttpSendRequest(hOpenRequest, NULL, 0, (void *)LoginXml.c_str(), LoginXml.size()); //发送http请求
    e = GetLastError();
    if (!bRequest || e == ERROR_INTERNET_TIMEOUT )
    {
    if (NULL != hOpenRequest)
    {
    InternetCloseHandle(hInternet);
    }
    if (NULL != hConnect)
    {
    InternetCloseHandle(hInternet);
    }
    if (NULL != hInternet)
    {
    InternetCloseHandle(hInternet);
    }
    return false;
    }
    //获取cookie
       if (m_cookie.empty())
       {
    DWORD dwBufferLength = 1024;
    CHAR lpBuffer[1024] = {0};
    CString strSetCookie;
    BOOL bHQI = HttpQueryInfo(hOpenRequest, HTTP_QUERY_SET_COOKIE, lpBuffer, &dwBufferLength, NULL);
    DWORD dwError = GetLastError();
    if (dwError == ERROR_INSUFFICIENT_BUFFER)
    {
    LPSTR lpSetCookie = new CHAR[dwBufferLength + 1];
    memset(lpSetCookie, 0, dwBufferLength + 1);
    HttpQueryInfo(hOpenRequest, HTTP_QUERY_COOKIE, lpBuffer, &dwBufferLength, NULL);
    strSetCookie = lpSetCookie;
    }
    if (bHQI)
    {
    strSetCookie = lpBuffer;
    int ix = strSetCookie.Find('=');
    int ixEnd = strSetCookie.Find(';');
    m_cookie = "Cookie: JSESSIONID=" + strSetCookie.Mid(ix + 1, ixEnd - ix -1);
    }

    } char szRes[1024 * 100] = {0};
    char szBuffer[1024 * 10] = {0};  
    DWORD dwByteRead = 0;
    while (InternetReadFile(hOpenRequest, szBuffer, sizeof(szBuffer), &dwByteRead) && dwByteRead > 0)
    {
    strncat(szRes, szBuffer, dwByteRead);
    memset(szBuffer, 0, sizeof(szBuffer));
    dwByteRead = 0;
    }
    ResponseXml = szRes;
    InternetCloseHandle(hOpenRequest);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hInternet);

    #ifdef _DEBUG
    {
    time_t t;
    time(&t);
    struct tm *ptr;
    ptr = localtime(&t);
    char nt[20] = {0};
    char date[20] = {0};
    char fileName[MAX_PATH] = {0};
    strftime(nt, 20, "%Y-%m-%d/%H:%M:%S", ptr);
    strftime(date, 20, "%Y-%m-%d", ptr);
    sprintf(fileName, "./ProtocolLog/%s.txt", date); ofstream of;
    of.open(fileName, ofstream::out | ofstream::app);

    CXmlParse xp;
    xp.Parse(ResponseXml.c_str());
    string req;
    xp.PrintXml(req);

    of << "时间:" << nt << endl;
    of << "请求包:" << LoginXml << endl;
    of << "应答包:" << req << endl;
    }
    #endif
    return true
    }
      

  2.   

    抓过包,差别就在出现错误的HttpSendRequest 那句,这句之后我连接不上,同事能连,我后面没包,而同事有
      

  3.   


    换WinHTTP试试吧,接口名字相仿,使用过程也一样的。Http应用的话,比WinINet好用些。
      

  4.   

    这有socket实现的http服务器,可以看看:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  5.   

    谢谢大家了!这帖子我都差点忘了。是其它地方有socket操作造成的,删了就好了
      

  6.   

    别人写的垃圾代码我在上面改,其他地方有socket操作影响了这里