我已经和服务器建立连接了,然后怎么写流数据给服务器呢?上下行都是UTF-8格式的。主要代码如下:HRESULT CMyConnection::Init()
{
GUID m_gNetwork;
HRESULT hr = ConnMgrMapURL(L"http://www.baidu.com", &m_gNetwork, 0);
if(SUCCEEDED(hr))
{
// AfxMessageBox(L"测试成功!");
DWORD dwStatus = 0;
//HANDLE hConnection = NULL;
CONNMGR_CONNECTIONINFO sConInfo;
memset(&sConInfo, 0 ,sizeof(CONNMGR_CONNECTIONINFO));
sConInfo.cbSize = sizeof(CONNMGR_CONNECTIONINFO);
sConInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
sConInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
sConInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP|CONNMGR_FLAG_PROXY_WAP|CONNMGR_FLAG_PROXY_SOCKS4|CONNMGR_FLAG_PROXY_SOCKS5;
sConInfo.bExclusive = FALSE;
sConInfo.bDisabled = FALSE;
sConInfo.guidDestNet = m_gNetwork;
hr = ConnMgrEstablishConnectionSync(&sConInfo, &hConnection, 15000, &dwStatus);
}
else
{
//AfxMessageBox(L"获取连接失败");
//::SetDlgItemText((HWND)param,IDC_STATIC_STATUS,L"连接失败!");
}
return hr;
}BOOL CMyConnection::GetConnectionStatus ( int nTimeoutSec, DWORD *pdwStatus/*=NULL*/ )
{
DWORD dwStartTime = GetTickCount ();
BOOL bRet = FALSE;
while ( GetTickCount ()-dwStartTime < (DWORD)nTimeoutSec * 1000 )
{
if ( hConnection )
{
DWORD dwStatus = 0;
HRESULT hr = ConnMgrConnectionStatus ( hConnection, &dwStatus );
if ( pdwStatus ) *pdwStatus = dwStatus;
if ( SUCCEEDED(hr) )
{
if ( dwStatus == CONNMGR_STATUS_CONNECTED )
{
bRet = TRUE;
break;
}
}
}
Sleep ( 100 );
} return bRet;
}CString CMyConnection::Connect()
{
HINTERNET hHttpOpen = NULL;
hHttpOpen = InternetOpen( TEXT("Dopad"),//as user agent
PRE_CONFIG_INTERNET_ACCESS,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0);
if (!hHttpOpen)
{
AfxMessageBox(TEXT("hHttpOpen failed!"));
return L"";
}
wprintf(L"连接URL:"+url); CString ip = L"";
CString port = L"";
int temp = url.Find(L"http://",0);
if(temp > 0)
{
AfxMessageBox(L"不是有效的url:http地址");
return L"";
}
else
{
url = url.Mid(7);
int i = url.Find(L":",0);
ip = url.Left(i);
url = url.Mid(i+1);
i = url.Find(L"/",0);
port = url.Left(i); url = url.Mid(i+1);
} //使用InternetConnect函数连接
HINTERNET hHttpSession = NULL;
hHttpSession = InternetConnectW( hHttpOpen,//当前会话句柄
ip, //Internet服务器主机名称
(INTERNET_PORT)_wtoi(port),//INTERNET_DEFAULT_HTTP_PORT, //HTTP端口
NULL,
NULL,
INTERNET_SERVICE_HTTP, //服务器类型 , HTTP
0,
0);
if (!hHttpSession)
{
AfxMessageBox(TEXT("hHttpSession failed!"));
//ExitProcess(101);//当HttpSendRequest出错的时候,退出进程
return L"";
}
HINTERNET hHttpRequest = NULL;
hHttpRequest = HttpOpenRequestW( hHttpSession,//InternetConnect()函数返回的HTTP会话句柄
TEXT("POST"),//动词名称
url,//指向包含动词的目标对象名称的字符串,
HTTP_VERSION,//指向包含HTTP版本的字符串
NULL,
NULL,
INTERNET_FLAG_DONT_CACHE,
0);
if (!hHttpRequest)
{
AfxMessageBox(TEXT("hHttpRequest failed!"));
return L"";
} CString header=L"";
if(sessionId.GetLength()>0)
{
//header = L"Accept:*/*\r\nAccept-Language:zh-cn\r\nUser-Agent:VCTestClient\r\n";
header.Format(L"Cookie JSESSIONID=%s",sessionId);
wprintf(L"header:%s\n",header);
}
/*if(!HttpSendRequestW( hHttpRequest, header, header.GetLength(), NULL,0 ))
{
AfxMessageBox(TEXT("HttpSendRequest failed!"));
InternetCloseHandle(hHttpOpen);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hHttpRequest);
return L"";
} */
DWORD dwRecvLen;
DWORD dwStatus;
DWORD dwLengthSize = sizeof(DWORD); if(!HttpQueryInfoW(hHttpRequest, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwLengthSize, NULL))
{
AfxMessageBox(TEXT("HttpQueryInfo failed!"));
return L"";
}
else
{
if(dwStatus>=200 && dwStatus<=300)
{
if(!HttpQueryInfoW(hHttpRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwRecvLen, &dwLengthSize, NULL))
{
AfxMessageBox(TEXT("HttpQueryInfo failed!"));
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hHttpOpen);
return L"";
}
}
else
{
CString log ;
log.Format(L"HTTP 错误,代码:%d\n",dwStatus);
wprintf(log);
}
}
char* pRecvBuf = new char[1024*10+1];//接受到的数据
DWORD dwReadSize;
BOOL bNewRecvBuf = TRUE;
CString recContent=L"";
//循环接收数据
//while (0 < dwRecvLen)
//{
if(!InternetReadFile(hHttpRequest, pRecvBuf, 1024*10, &dwReadSize))
{
if(bNewRecvBuf)
delete [] pRecvBuf;
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hHttpOpen);
}
dwRecvLen -= dwReadSize;
pRecvBuf[dwReadSize] = '\0';
//转码
DWORD dwNum = MultiByteToWideChar (CP_UTF8, 0, pRecvBuf, -1, NULL, 0); //接下来,我们只需要分配响应的数组空间:
TCHAR *pwText;
pwText = new TCHAR[dwNum];
if(!pwText)
{
delete []pwText;
} //接着,我们就可以着手进行转换了.在这里以转换成utf-8码做为例子:
MultiByteToWideChar (CP_UTF8, 0, pRecvBuf, -1, pwText, dwNum); recContent += pwText;
wprintf(L"接收到"+recContent+L"\n");
//最后,使用完毕当然要记得释放占用的内存:
delete []pwText;
delete []pRecvBuf;
//}
/*::MultiByteToWideChar(CP_ACP, 0, url, -1, NULL, 0,NULL,NULL)
int len = ::WideCharToMultiByte(CP_ACP, 0, url, -1, NULL, 0,NULL,NULL);
char* mCharUrl = new char[len+1];
::WideCharToMultiByte(CP_ACP, 0, url, -1, mCharUrl, len,NULL,NULL);*/
return recContent;
}
{
GUID m_gNetwork;
HRESULT hr = ConnMgrMapURL(L"http://www.baidu.com", &m_gNetwork, 0);
if(SUCCEEDED(hr))
{
// AfxMessageBox(L"测试成功!");
DWORD dwStatus = 0;
//HANDLE hConnection = NULL;
CONNMGR_CONNECTIONINFO sConInfo;
memset(&sConInfo, 0 ,sizeof(CONNMGR_CONNECTIONINFO));
sConInfo.cbSize = sizeof(CONNMGR_CONNECTIONINFO);
sConInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
sConInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
sConInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP|CONNMGR_FLAG_PROXY_WAP|CONNMGR_FLAG_PROXY_SOCKS4|CONNMGR_FLAG_PROXY_SOCKS5;
sConInfo.bExclusive = FALSE;
sConInfo.bDisabled = FALSE;
sConInfo.guidDestNet = m_gNetwork;
hr = ConnMgrEstablishConnectionSync(&sConInfo, &hConnection, 15000, &dwStatus);
}
else
{
//AfxMessageBox(L"获取连接失败");
//::SetDlgItemText((HWND)param,IDC_STATIC_STATUS,L"连接失败!");
}
return hr;
}BOOL CMyConnection::GetConnectionStatus ( int nTimeoutSec, DWORD *pdwStatus/*=NULL*/ )
{
DWORD dwStartTime = GetTickCount ();
BOOL bRet = FALSE;
while ( GetTickCount ()-dwStartTime < (DWORD)nTimeoutSec * 1000 )
{
if ( hConnection )
{
DWORD dwStatus = 0;
HRESULT hr = ConnMgrConnectionStatus ( hConnection, &dwStatus );
if ( pdwStatus ) *pdwStatus = dwStatus;
if ( SUCCEEDED(hr) )
{
if ( dwStatus == CONNMGR_STATUS_CONNECTED )
{
bRet = TRUE;
break;
}
}
}
Sleep ( 100 );
} return bRet;
}CString CMyConnection::Connect()
{
HINTERNET hHttpOpen = NULL;
hHttpOpen = InternetOpen( TEXT("Dopad"),//as user agent
PRE_CONFIG_INTERNET_ACCESS,
NULL,
INTERNET_INVALID_PORT_NUMBER,
0);
if (!hHttpOpen)
{
AfxMessageBox(TEXT("hHttpOpen failed!"));
return L"";
}
wprintf(L"连接URL:"+url); CString ip = L"";
CString port = L"";
int temp = url.Find(L"http://",0);
if(temp > 0)
{
AfxMessageBox(L"不是有效的url:http地址");
return L"";
}
else
{
url = url.Mid(7);
int i = url.Find(L":",0);
ip = url.Left(i);
url = url.Mid(i+1);
i = url.Find(L"/",0);
port = url.Left(i); url = url.Mid(i+1);
} //使用InternetConnect函数连接
HINTERNET hHttpSession = NULL;
hHttpSession = InternetConnectW( hHttpOpen,//当前会话句柄
ip, //Internet服务器主机名称
(INTERNET_PORT)_wtoi(port),//INTERNET_DEFAULT_HTTP_PORT, //HTTP端口
NULL,
NULL,
INTERNET_SERVICE_HTTP, //服务器类型 , HTTP
0,
0);
if (!hHttpSession)
{
AfxMessageBox(TEXT("hHttpSession failed!"));
//ExitProcess(101);//当HttpSendRequest出错的时候,退出进程
return L"";
}
HINTERNET hHttpRequest = NULL;
hHttpRequest = HttpOpenRequestW( hHttpSession,//InternetConnect()函数返回的HTTP会话句柄
TEXT("POST"),//动词名称
url,//指向包含动词的目标对象名称的字符串,
HTTP_VERSION,//指向包含HTTP版本的字符串
NULL,
NULL,
INTERNET_FLAG_DONT_CACHE,
0);
if (!hHttpRequest)
{
AfxMessageBox(TEXT("hHttpRequest failed!"));
return L"";
} CString header=L"";
if(sessionId.GetLength()>0)
{
//header = L"Accept:*/*\r\nAccept-Language:zh-cn\r\nUser-Agent:VCTestClient\r\n";
header.Format(L"Cookie JSESSIONID=%s",sessionId);
wprintf(L"header:%s\n",header);
}
/*if(!HttpSendRequestW( hHttpRequest, header, header.GetLength(), NULL,0 ))
{
AfxMessageBox(TEXT("HttpSendRequest failed!"));
InternetCloseHandle(hHttpOpen);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hHttpRequest);
return L"";
} */
DWORD dwRecvLen;
DWORD dwStatus;
DWORD dwLengthSize = sizeof(DWORD); if(!HttpQueryInfoW(hHttpRequest, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwLengthSize, NULL))
{
AfxMessageBox(TEXT("HttpQueryInfo failed!"));
return L"";
}
else
{
if(dwStatus>=200 && dwStatus<=300)
{
if(!HttpQueryInfoW(hHttpRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwRecvLen, &dwLengthSize, NULL))
{
AfxMessageBox(TEXT("HttpQueryInfo failed!"));
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hHttpOpen);
return L"";
}
}
else
{
CString log ;
log.Format(L"HTTP 错误,代码:%d\n",dwStatus);
wprintf(log);
}
}
char* pRecvBuf = new char[1024*10+1];//接受到的数据
DWORD dwReadSize;
BOOL bNewRecvBuf = TRUE;
CString recContent=L"";
//循环接收数据
//while (0 < dwRecvLen)
//{
if(!InternetReadFile(hHttpRequest, pRecvBuf, 1024*10, &dwReadSize))
{
if(bNewRecvBuf)
delete [] pRecvBuf;
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hHttpOpen);
}
dwRecvLen -= dwReadSize;
pRecvBuf[dwReadSize] = '\0';
//转码
DWORD dwNum = MultiByteToWideChar (CP_UTF8, 0, pRecvBuf, -1, NULL, 0); //接下来,我们只需要分配响应的数组空间:
TCHAR *pwText;
pwText = new TCHAR[dwNum];
if(!pwText)
{
delete []pwText;
} //接着,我们就可以着手进行转换了.在这里以转换成utf-8码做为例子:
MultiByteToWideChar (CP_UTF8, 0, pRecvBuf, -1, pwText, dwNum); recContent += pwText;
wprintf(L"接收到"+recContent+L"\n");
//最后,使用完毕当然要记得释放占用的内存:
delete []pwText;
delete []pRecvBuf;
//}
/*::MultiByteToWideChar(CP_ACP, 0, url, -1, NULL, 0,NULL,NULL)
int len = ::WideCharToMultiByte(CP_ACP, 0, url, -1, NULL, 0,NULL,NULL);
char* mCharUrl = new char[len+1];
::WideCharToMultiByte(CP_ACP, 0, url, -1, mCharUrl, len,NULL,NULL);*/
return recContent;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货