如何获取网页文件的大小

augustwong 2011-04-12 11:17:21
如题 如何编写c程序获取某个网页的大小啊,不是指尺寸大小,是那个网页的大小。

比如让我输入 www.sina.com.cn 得到结果218KB 这样子

谢谢大家了 希望可以详细些 有实例最好了 谢谢
...全文
299 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianxian001 2012-01-15
  • 打赏
  • 举报
回复
用HEAD方式发送HTTP请求,大部分静态网页都可以返回Content-Length字段
bluesky12312388 2011-04-12
  • 打赏
  • 举报
回复
直接发送HTTP请求,响应头面面有个conten-length:xxxx 这里就是网页的大小。

HTPP请求:Get csdn.net/index.html /HTTP1.1
delphiwcdj 2011-04-12
  • 打赏
  • 举报
回复
参考

BOOL DownloadFile(LPCSTR pstrURL, LPCSTR pstrSaveFileName, BOOL bBinary = TRUE)
{
CInternetSession sess;
CStdioFile *pHttpFile = NULL;

DWORD dwHttpFlag = INTERNET_OPEN_TYPE_PRECONFIG
| INTERNET_FLAG_EXISTING_CONNECT
| INTERNET_FLAG_NO_AUTO_REDIRECT
// | INTERNET_FLAG_RELOAD
| INTERNET_FLAG_NO_COOKIES
// | INTERNET_FLAG_DONT_CACHE
// | INTERNET_FLAG_PRAGMA_NOCACHE
| INTERNET_FLAG_MAKE_PERSISTENT
;

UINT nSaveFlag = CFile::modeCreate | CFile::modeWrite;
if(bBinary)
{
dwHttpFlag |= INTERNET_FLAG_TRANSFER_BINARY;
nSaveFlag |= CFile::typeBinary;
}
else
{
dwHttpFlag |= INTERNET_FLAG_TRANSFER_ASCII;
nSaveFlag |= CFile::typeText;
}

try
{
sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,32000);
sess.SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
sess.SetOption(INTERNET_OPTION_CONNECT_RETRIES,5);

pHttpFile = sess.OpenURL(pstrURL, 1, dwHttpFlag);
}
catch(CInternetException *e)
{
TCHAR tszErr[1024];
if(e-> GetErrorMessage(tszErr, sizeof(tszErr)))
{
AfxMessageBox(tszErr);
}

e-> Delete();
return FALSE;
}

if(NULL == pHttpFile)
{
return FALSE;
}

CStdioFile fout;
if( !fout.Open(pstrSaveFileName, nSaveFlag) )
{
delete pHttpFile;
sess.Close();
return FALSE;
}

if(bBinary)
{
#define BUF_LEN 1024 * 8

BYTE tszBuff[BUF_LEN] = {0};
UINT nRead = 0;
while( (nRead = pHttpFile-> Read(tszBuff, BUF_LEN)) > 0)
{
fout.Write(tszBuff, nRead);
}
#undef BUF_LEN
}
else
{
CString str = _T( " ");
while(pHttpFile-> ReadString(str))
{
str += _T( "\n ");
fout.WriteString(str);
}
}
fout.Close();

delete pHttpFile;
sess.Close();

return TRUE;
}

xmu_才盛 2011-04-12
  • 打赏
  • 举报
回复
下载吧,
然后用
fseek(pFile, 0, SEEK_END);
DWORD dwFileSize = ftell(pFile);
就可以知道 文件精确大小是 dwFileSize
delphiwcdj 2011-04-12
  • 打赏
  • 举报
回复
直接把网页下载下来,再计算大小
pamtry 2011-04-12
  • 打赏
  • 举报
回复
补充一点,如果只获取http响应头的话,应该用HEAD去请求,而不是GET
pamtry 2011-04-12
  • 打赏
  • 举报
回复
在返回的HTTP报头中有一个Content-Length字段,解析该字段即可

LS的代码算是个示例,但是实际使用的时候,应该接收到\r\n\r\n后立刻停止接包(这个是报头的结束符),然后解析报头的Content-Length字段即可
bluesky12312388 2011-04-12
  • 打赏
  • 举报
回复
随手写了个,没加错误处理。

代码:
     #include <stdio.h>
#include <winsock2.h>

#pragma comment(lib,"Ws2_32.lib")


int main()
{
WSADATA wsa;
WSAStartup(MAKEWORD(2,2),&wsa);

SOCKET serverSocket;

serverSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);


struct sockaddr_in serverAddress;
memset(&serverAddress,0,sizeof(sockaddr_in));
serverAddress.sin_family=AF_INET;
serverAddress.sin_addr.S_un.S_addr = inet_addr("211.100.26.77");
serverAddress.sin_port = htons(80);

connect(serverSocket,(struct sockaddr*)&serverAddress,sizeof(serverAddress));

char * msgHttpRequest = "GET /index.html HTTP/1.1\r\n"
"Host:csdn.net\r\n\r\n";

send(serverSocket,msgHttpRequest,strlen(msgHttpRequest),0);


char recvBuff[1024] = { 0 };
recv(serverSocket,recvBuff,1024,0);

printf("%s\n",recvBuff);


return 0;
}


结果:HTTP/1.1 404 Not Found
Server: nginx/0.7.68
Date: Tue, 12 Apr 2011 09:51:42 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 11170 //这个就是你要的网页大小
Connection: keep-alive
Vary: Accept-Encoding

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or
g/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSDN 鎻愮ず椤甸潰</title>
<style rel="stylesheet">
/*top*/
body{margin:0 auto; background:#fff; font-size:12px; font-family:simsun; font-we
ight:normal;}
img { border:none;}
ul, ol, li, p, dl, dt, dd{margin:0; padding:0; list-style:none;}
.font_red{color:#f00; font-size:12px; }
.font_gray{color:#333;}
a.font_gray:link, a.font_gray:visited, a.font_gray:active{color:#333; text-decor
ation:underline; font-size:12px;}
a.font_gray:hover{color:#f00;}
.clear{clear:both;}

.nav_top{width:auto; border-bottom:1px solid #ccc; height:20px; line-height:20px
;}
CppCoder 2011-04-12
  • 打赏
  • 举报
回复
解析HTTP响应的信息
Content-Length:
这个字段

仅供参考
challenge99 2011-04-12
  • 打赏
  • 举报
回复
楼上说的那么肯定,何必问呢
augustwong 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 newstudent_never 的回复:]

下载吧,
然后用
fseek(pFile, 0, SEEK_END);
DWORD dwFileSize = ftell(pFile);
就可以知道 文件精确大小是 dwFileSize
[/Quote]

肯定不是下载了,下载就好办了,是用socket去bind那个网页,然后得到相关的信息。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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