我想向HTTP服务器POST数据对,用什么办类,怎样用? 比如想发送登录数据对user=admin passwd=123456? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给你一个例子: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;} 运行时服务器检测不到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")%> 通过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;} 求助:Direct9 渲染大量直线段的问题。谢谢! opengl和显卡驱动之间是什么关系 有多少考下中级程序员的 什么是注释宏?有何作用? 不让用户在Combo Box控件进行输入,而只让用户进行选择,该怎么办? 视/文档结构中如何不让状态条显示菜单或工具栏上的提示信息? 怎样调试SPI(.dll)程序?等待高手回答。 调用DLL时出错,小毛病,来看看吧! 请问如何做一个带资源的dll 这样做为什么不行? 两问,怎样打印直线,圆等图形?在Dialog中如何添加打印预览? 分割视图中,小弟用DELETECOLUMN去掉了其中一列,但是现在想重新启用,应该怎么弄?
{
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;
}
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")%>
用这种方法关键是要知道应该给服务器提交些什么数据如果自己去看网页文件,然后分析应该向服务器提交什么数据,网页很简单时还差不多,如果网页很复杂,那就属于费力不讨好的事。现在不是考试,那种事情我们就不做了,现在有一个更简单的办法,就是用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;
}