//******************q1htp.h*********************************
#ifndef Q1HTP_H
#define Q1HTP_H
#include <QString>
#include <QObject>
#include <QUrl>
class Down:QObject
{
Q_OBJECT
public:
QString getHttp(QUrl *);
int flag;
public slots:
void httpdone(bool);
};
#endif
//*****************************q1htp.cpp*********************
#include <QString>
#include <QtNetwork/QHttp>
#include <QUrl>
#include <QByteArray>
#include "q1htp.h"
using namespace std;
#include <iostream>
QString Down::getHttp(QUrl *url)
{ flag=0;
QUrl *url1=new QUrl("http://www.boc.cn/sourcedb/whpj/");
QHttp *http = new QHttp(0);
http->setHost(url1->host());
http->get(url1->path());
connect(http, SIGNAL(done(bool)), this, SLOT(httpdone(bool)));
cout<<http->readAll().data()<<"^^^^^";
if(flag==1)
return http->readAll().data();
else return 0;
}
void Down::httpdone(bool error)
{ cout<<"safbsdjk";
if (error == false)
{
flag=1;
}
}
我跟踪了一下,没有返回任何东西,0都没有返回,这是为什么呢,水知道怎么下载阿,我急用呢。
还有我用c写了一个下载的程序,有时候好用,有时候不好用,代码有时候会缺少一些东西不知道为什么,我给大家贴出来看看
p, li { white-space: pre-wrap; }
p, li { white-space: pre-wrap; }
using namespace std;
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string>
#include <cstring>
#include <iconv.h>
#include "htp.h"
void toLowstr(char *str)
{
for(int i=0;str!='\0';i++)
if(str>='A'&&str<='Z')
str+='a'-'A';
}
//char *str=new char[10724287];
//static char strs[2724287];
char strs[2724287];
char *geturl(char *url)
{
memset(strs,0,2724287);
int sockfd;
struct sockaddr_in addr;
struct hostent *pURL;
char myurl[65535];
char *pHost = 0;
char host[32767], GET[32767];
char header[32767] = "";
static char text[65535];
char *str,*str1,*str2,*str3;
str=strs;
string code = "gb2312";
int i;
str2=strs;
string sstr1;
/*
* 分离url中的主机地址和相对路径
*/
strcpy(myurl, url);
i=strlen(myurl);
if(myurl[0]=='h'&&myurl[1]=='t'&&myurl[2]=='t'&&myurl[3]=='p')
for(int i1=0;i1<=i-7;i1++)
{
myurl[i1]=myurl[i1+7];
}
for (pHost = myurl; *pHost != '/' && *pHost != '\0'; ++pHost)
{
};
if ( (int)(pHost - myurl) == strlen(myurl) )
strcpy(GET, "/");
else
strcpy(GET, pHost);
*pHost = '\0';
strcpy(host, myurl);
//printf("%s\n%s\n", host, GET);
/*
* 设定socket参数,并未真正初始化
*/
sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
pURL = gethostbyname(host);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
addr.sin_port =htons(80);
/*
* 组织发送到web服务器的信息
* 为何要发送下面的信息请参考HTTP协议的约定
*/
strcat(header, "GET ");
strcat(header, GET);
strcat(header, " HTTP/1.1\r\n");
strcat(header, "HOST: ");
strcat(header, host);
strcat(header, "\r\nConnection: Close\r\n\r\n");
/*
* 连接到服务器,发送请求header,并接受反馈(即网页源代码)
*/
connect(sockfd,(sockaddr *)&addr,sizeof(addr));
send(sockfd, header, strlen(header), 0);
size_t n=0;
unsigned int p,q,t;
iconv_t cd;
unsigned int m;
//str=new char [204800];
///memset(str,0,204800);
m=65536;
q=0;
const char *code1="";
while ( n=recv(sockfd, text, 65535, 0) > 0)
{
p=strlen(text);
t=p;
n=size_t(p);
str1=new char [n+1];
str3=str1;
strcpy(str1,text);
if(q==0)
{
toLowstr(str1);
sstr1=str1;
int n1,n2;
n2=sstr1.find("<html");
n1= sstr1.find("charset",n2);
n2=sstr1.find("\"",n1);
if(n1!=-1)
{
code= sstr1.substr(n1+8,n2-n1-8);
code1=code.c_str();
// cout<<"%%%%%%%%%%%%%%"<<code<<endl;
}
}
q++;
cd = iconv_open("gb2312",code1);
if (iconv(cd,&str1,&n,&str,&m)==-1) {};
iconv_close(cd);
//n++;
delete (str3);
}
//cout<<"&&&&&&&&&&"<<n<<"%%%%%%%%%"<<endl;
close(sockfd);
return str2;
}