用vc6提供的方法,哪种方法能够很稳定地读取网页内容(能够兼容死链接而不过于超时)? ,前面我提出过这个问题,有几位兄弟给出了不同的意见。
已经结帖。我现在用抄来的一个httpClient类,能够直接用socket下载一些网页。
但比如 http://www.sina.com.cn/index.html 和http://www.163.com/index.html都无法下载。 
怎么能够让httpClient类通用呢?代码如下://HTTP下载主程序
bool CHttpClient::Download(char *url, HWND hParent,long msg)
{
m_Message=m_Message;
m_hParent=hParent; //状态为忙 Reset();
char hostname[256];
memset(hostname,0,256);
GetHostName(url,hostname); long AllSize=0;
long ReadSize=0;
bool headFinished=false; int s;
s=tcp.connect(hostname,80,TCP_TIMEOUT,1);
if(s<0)
return false; sprintf(m_buffer,"GET %s HTTP/1.0 \r\nHost:%s\r\nAccept:*/*\r\nUser-Agent: AutoUpdate/1.0 \r\n\r\n",url,hostname);
tcp.send(s,m_buffer,strlen(m_buffer),TCP_TIMEOUT); //先取PEEK_SIZE个字节,这样可以确保取到Content-Length
ReadSize=tcp.recv(s,m_buffer,PEEK_SIZE,TCP_TIMEOUT);
if(ReadSize==-1)
return false;
m_buffer[ReadSize]=0; memset(hostname,0,256); int m,n;
m=Instr(m_buffer," ");
n=Instr(m_buffer+m+1," ");
memcpy(hostname,m_buffer+m+1,n); m_status=atoi(hostname);
if(m_status!=200)
return false;
memset(hostname,0,256);
if(GetHeader(m_buffer,"Content-Length",hostname)<0)
return false;

//取得内容总长度
AllSize=atol(hostname);
//AllSize = 100080; memset(hostname,0,256); //寻找HTTP数据区表示
int i;
i = Instr( m_buffer, "\r\n\r\n" );
if( i > 0 )
{
memcpy( m_heads_buffer, m_buffer, i + 4 );
headFinished = true;
ReadSize = ReadSize - i - 4;
OnDataRecived( m_buffer + i + 4, ReadSize, true );
} while(ReadSize<AllSize && m_noCancel)
{
int nSize;
if(headFinished)
{
nSize=(AllSize-ReadSize)>BUFFER_SIZE?BUFFER_SIZE:(AllSize-ReadSize);
memset(m_buffer,0,BUFFER_SIZE);
if(tcp.recv(s,m_buffer,nSize,TCP_TIMEOUT)!=nSize)
return false;
ReadSize+=nSize;
m_buffer[nSize]=0; OnDataRecived(m_buffer,nSize);
}
else
{
nSize=(AllSize-ReadSize)>(BUFFER_SIZE-ReadSize)?(BUFFER_SIZE-ReadSize):(AllSize-ReadSize);
if(tcp.recv(s,m_buffer+ReadSize,nSize,TCP_TIMEOUT)!=nSize)
return false;
ReadSize+=nSize;
m_buffer[nSize]=0;
//寻找HTTP数据区表示
i=Instr(m_buffer,"\r\n\r\n");
if( i > 0 )
{
memcpy( m_heads_buffer, m_buffer, i + 4 );
headFinished=true;
ReadSize =ReadSize-i-4;
OnDataRecived( m_buffer + i + 4, ReadSize, true);
}
}
}
 
 if(!m_noCancel)
 remove(m_fname);  tcp.close(s);
 return true;
}我怀疑有的网站开的端口不是80,所以上述代码无法下载有效的网页。请教网络编程高手来解答。另外,我另外用一个工程:SendHTTP向新浪首页和163首页发SendHttp也不行。(另外,用htmlView方法(含其中组件),WinInet方法,我都做过充分测试,都可以用来下载网页,但稳定性都有一定的问题,请不要再提这些方法)。

解决方案 »

  1.   

    sprintf(m_buffer,"GET %s HTTP/1.0 \r\nHost:%s\r\nAccept:*/*\r\nUser-Agent: AutoUpdate/1.0 \r\n\r\n",url,hostname);
    从我的经验看 很多服务器不允许 会给你440 错误。 你还需要加点语言, 浏览器的信息在里面。  端口肯定是80 的了 你看看自己的url 就知道了//先取PEEK_SIZE个字节,这样可以确保取到Content-Length  这个做法也不正确的。
    content-length 不一定会给你。 http 有2中模式。 PEEK_SIZE 是多少? 你怎么知道一定在里面?