用vc6提供的方法,哪种方法能够很稳定地读取网页内容(能够兼容死链接而不过于超时)? 续

ac1998 2006-10-22 06:37:34

用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方法,我都做过充分测试,都可以用来下载网页,但稳定性都有一定的问题,请不要再提这些方法)。

...全文
313 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ac1998 2006-10-28
  • 打赏
  • 举报
回复

mark.

ac1998 2006-10-24
  • 打赏
  • 举报
回复

up.
ac1998 2006-10-24
  • 打赏
  • 举报
回复

up.
ac1998 2006-10-23
  • 打赏
  • 举报
回复

up.
benjiam 2006-10-23
  • 打赏
  • 举报
回复
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 是多少? 你怎么知道一定在里面?
ac1998 2006-10-23
  • 打赏
  • 举报
回复

mark.

up.
ac1998 2006-10-22
  • 打赏
  • 举报
回复

up.
内容概要:本文系统研究了构网型变流器的正负序阻抗解耦特性及其在弱电网环境下的稳定性表现,重点依托Matlab/Simulink仿真平台,构建了详细的阻抗数学模型,设计了解耦控制策略,并采用小信号扫频法进行频域辨识与稳定性验证。研究深入探讨了构网型变流器与传统跟网型逆变器在正负序阻抗特性上的本质差异,结合虚拟同步发电机(VSG)等先进控制技术,分析其在抑制宽频带振荡、削弱锁相环动态耦合等方面的优越性。文中不仅提供了完整的仿真模型与MATLAB代码实现,还整合了光伏、风电、储能、微电网等多类新能源系统的阻抗建模与稳定性分析资源,形成了一套面向新型电力系统稳定性的综合性技术资料体系,具有较强的科研复现与工程参考价值。; 适合人群:面向具备电力电子、电力系统自动化、新能源并网等专业背景的研究生、高校教师及工程技术人员,特别适用于从事阻抗建模、小干扰稳定性分析、宽频振荡机理研究以及撰写高水平学术论文的科研工作者。; 使用场景及目标:①掌握构网型变流器正负序阻抗建模与扫频辨识的仿真方法;②深入理解VSG等构网型控制在弱电网中提升稳定性的内在机理;③复现顶刊论文中的阻抗分析流程与稳定性判据应用;④利用提供的成熟模型与代码加速科研进程,支撑课题研究与学术成果产出。; 阅读建议:建议结合文中提供的Simulink模型与MATLAB代码,按照“理论建模—仿真搭建—扫频激励—频响提取—Nyquist判据分析”的完整流程进行实践操作,重点关注扫频信号的注入方式、频率范围设置及阻抗曲线的物理意义解读,并参考博士论文复现案例深化对复杂动态耦合问题的理解。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧