用WinInet做的http客户端应用,老是12029错误,怎么办?

看着捉急 2013-10-23 05:11:42
用http发送xml包与服务器交互, 也就是用http包装了一层协议。做交易的,登陆啊,买,卖。都有一个对应的xml报文格式。

做登陆功能,
flag:
第一次发送正确的登陆包(也就是用户名密码正确),后面其他协议没有问题。
如果第一次发了错误的登陆包(用户名或密码错误),即使接下来发正确的登陆包也老是出错,登陆不上,getlasterror 返回12029.msdn说
The attempt to connect to the server failed
重新启动程序后:
go to flag;

我每次发完http请求都close了所有handle。同事xp系统没这问题,我win7系统。用的Wininet API这到底什么原因啊?一直解决不了,很急呀,求大神们指点一下?生不如死中.....
...全文
2897 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
看着捉急 2014-03-08
  • 打赏
  • 举报
回复
引用 5 楼 u013633568 的回复:
楼主怎么解决的?能说一下吗?
别人写的垃圾代码我在上面改,其他地方有socket操作影响了这里
看着捉急 2014-03-08
  • 打赏
  • 举报
回复
谢谢大家了!这帖子我都差点忘了。是其它地方有socket操作造成的,删了就好了
laqhelen 2014-02-27
  • 打赏
  • 举报
回复
这有socket实现的http服务器,可以看看: http://download.csdn.net/detail/geoff08zhang/4571358
goodyang2012 2014-02-27
  • 打赏
  • 举报
回复
楼主怎么解决的?能说一下吗?
ArcRain 2013-10-23
  • 打赏
  • 举报
回复
引用 3 楼 FRcheng 的回复:
抓过包,差别就在出现错误的HttpSendRequest 那句,这句之后我连接不上,同事能连,我后面没包,而同事有
换WinHTTP试试吧,接口名字相仿,使用过程也一样的。Http应用的话,比WinINet好用些。
看着捉急 2013-10-23
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
抓包分析对比一下你的跟同事的。是否服务端有限制等
抓过包,差别就在出现错误的HttpSendRequest 那句,这句之后我连接不上,同事能连,我后面没包,而同事有
oyljerry 2013-10-23
  • 打赏
  • 举报
回复
抓包分析对比一下你的跟同事的。是否服务端有限制等
看着捉急 2013-10-23
  • 打赏
  • 举报
回复
要是真是系统兼容问题还好些,就怕是其他部分影响了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
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧