太阳当空照,今天的青岛又是一个阳光明媚天,昨天的一场毛毛春雨,意会的春意盎然的风采,如果天天能有这样的天气和心情,我想人不想长寿都不行。确实如此今天的301公交车也是不像往常那样挤的要死,空闲了很多,明媚的好天气,我在想人们的心情也可以稍微放松一下,去除昨日忙碌的疲惫心态,投入到今天的美好时光。
昨天发布了一段c语言实现的http消息代码,正好昨天mona项目中的使用vc跟apache进行交互的地方有点问题,几個围起来讨论,流程是很正确的,感觉没有什么问题,可是在向页面发送http请求返回的html代码中,提取的字符串总是有问题,最大的问题就是不能够更新,通过抓包工具发现http消息是发送正确的,每次都是可以看到发送的,可是只有第一的返回结果正确,以后每次都不能正确。这个问题真是让人很纳闷。
我利用下午的时间根据以前我做的那个http消息,我先是使用了c语言去对服务器发送http请求,然后打印结果发现竟然没有问题,每次发送都是没有问题。 c中是使用的socket通信,而mona项目中的客户端是使用vc来实现的,有着很大的差距,我这人对c还是比较熟悉一点,vc也就是懂那么一点点,根据前面我自己做的那个搜索ip地址用vc做的程序,记得当时里面有使用vc来发送http消息的代码,我做了一些修改,也是对那个服务器发送http请求,我通过messagebox打印结果发现,竟然是没有问题,而比对黄姐的那段发送代码,感觉基本上是一样的。很是奇怪是不是?
呵呵,这里我又想说,很多东西看起来好像是一样的,刚才我不也是说了嘛我比对黄姐的代码基本上是一样的,这个基本两个字说明了还是有不同,使用的类是一样的,可是为什么我的每次就可以而黄姐的就不行的。说实话我最初我还真没有发现不同的地方,还是黄姐心细,她跟我说其中的那个sendrequst方法中我的代码定义了传送内容的字符串内存空间,而姐的是使用了默认的,并没有定义内存空间。后来根据这一点不同我分别做了测试,竟然发现问题就是出在这里,使用msdn查看一下这个方法类吧,原来微软的这个些发布人也是有错误的,终于让我知道了权威也是不能百分百的相信的,msdn中明明说可以定义也可以不定义使用默认情况,可是这里如果不定义,发送一次http是可以获得最新的返回结果,多次发送则返回的还是旧的结果。而如果定义了发送内容的空间,哪怕是一个字符,都是会返回最新结果的。真是很奇怪,几個人讨论了一番也没有结果,猜测要不然是msdn写错了,要不然就是apache处理方面有问题。反正这个问题我没有知道,也没有到网上去搜搜看有有什么说法,不过总是让我明白了,做研发要多次的去实验,每一个类函数如果要调用最好是把默认和非默认情况下的结果都测试一下。这样永远不会出现错误。
又说了这么多,您千万不要怪我太烦,因为的脑袋记性不是很好,很多的东西我要写出来方便以后查阅,毕竟我把东西给你出来共享,您千万谅解我唷。小丸子还是给你鞠躬了。废话不多说了 代码共享。
void CLogin::connecthttp(CString ServerName)
{
CInternetSession session("dvbbs");
CHttpConnection* pServer = NULL;
CHttpFile* pFile = NULL;
// CString ServerName = "10.88.100.7";
INTERNET_PORT nPort = 80;
DWORD retcode;
// char outBuff1[300]="id=Admin&password=0000&Submit.x=0&Submit.y=0";
char outBuff[1024];
//"dhcp=on&ipaddress1="+ip1+"&ipaddress2=&ipaddress3=&ipaddress4=&netmask1=255&netmask2=255&netmask3=255&netmask4=0&gateway1=10&gateway2=88&gateway3=100&gateway4=254&nameserver1=168&nameserver2=95&nameserver3=1&nameserver4=1&netsecondary1=&netsecondary2=&netsecondary3=&netsecondary4=";
// memset(outBuff,0,sizeof(outBuff));
//sprintf(outBuff,);
try
{
pServer = session.GetHttpConnection(ServerName,nPort);
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, "/cgi-bin/admin/network_ddns.cgi");
//pFile -> AddRequestHeaders("Content-Type: application/x-www-form-urlencoded");
// pFile -> AddRequestHeaders("Accept: */*");
// pFile -> AddRequestHeaders("Authorization: Basic QWRtaW46MDAwMA==");
// pFile -> SendRequest(NULL,0,outBuff,strlen(outBuff)+1);
CString strHeaders = _T("Accept: text*/*/r/nContent-Type: application/x-www-form-urlencoded/r/nAuthorization: Basic QWRtaW46MDAwMA== ");
result = (pFile)->SendRequest(strHeaders,outBuff, strlen(outBuff)+1);
pFile -> QueryInfoStatusCode(retcode);
// CString smsg(""),tmp;
// for(int i=0;i<100000;i++)
// {
// pFile->ReadString(tmp);
// smsg+='/n';
// smsg+=tmp;
// }
// AfxMessageBox(smsg);
char szBuff[4096];
CString strHtml;
if (retcode == HTTP_STATUS_OK)
{
UINT nRead;
while ((nRead = (pFile)->Read(szBuff,4096)))
{
if(nRead)
{
AfxMessageBox(szBuff);
strHtml+=CString(szBuff,nRead);
}
if(nRead<4096)
continue;
}
}
}
catch (CInternetException *msg){MessageBox("error");};
delete pFile;
delete pServer;
session.Close();
}
其中//是我注释掉的,改用别的形势的,其实是一样的都是可以实现发送http消息的功能的,不过//中的会只弹出一部分的html代码的messagebox,这样不方便查看,后面使用的if判断是每次读取4096个字符的,会显示所有的结果的。