找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3379|回复: 1

对指定域名获取网页内容

[复制链接]
发表于 2008-1-17 18:53:54 | 显示全部楼层 |阅读模式
我想问下,下面的程序获取的html文件为什么用浏览器打开失真了?

获取数据哪里有问题吗?
std::cout<<strlen(buf)<<std::endl
而且这一句老是输出4104。。。

谢谢指教。
  1. void main(int argc, char* argv[])
  2. {
  3. WORD version=MAKEWORD(1,1);
  4. WSADATA wsaData;
  5. int err=WSAStartup(version,&wsaData);
  6. if ( err != 0 ) {
  7.   return;
  8. }
  9. if (LOBYTE(wsaData.wVersion)!=1
  10.   || HIBYTE(wsaData.wVersion)!=1)
  11. {
  12.   WSACleanup();
  13.   return;
  14. }
  15. SOCKET sock=socket(AF_INET,SOCK_STREAM,0);
  16. SOCKADDR_IN sockadrr;
  17. char *host_server="www.163.com";
  18. hostent *pHost=gethostbyname(host_server);
  19.       
  20. LPCSTR psz=inet_ntoa (*(in_addr*)pHost->h_addr_list[0]);
  21. sockadrr.sin_addr.S_un.S_addr=inet_addr(psz);
  22. sockadrr.sin_family=AF_INET;
  23. sockadrr.sin_port=htons(80);
  24. char *Command="GET /index.html HTTP/1.1 \r\nHost: [url]www.163.com[/url]\r\nAccept: image/gif \r\n\r\n";
  25. int len=sizeof(SOCKADDR);
  26. connect(sock,(SOCKADDR*)&sockadrr,len);
  27. sendto(sock,Command,strlen(Command)+1,0,(SOCKADDR*)&sockadrr,len);
  28. std::ofstream ous("C:\\Documents and Settings\\Administrator\\桌面\\163com.html",std::ios::binary);
  29. char buf[4096];
  30. while(recvfrom(sock,buf,4096,0,(SOCKADDR*)&sockadrr,&len)>0)
  31. {
  32.   std::cout<<strlen(buf)<<std::endl;
  33.   if(strlen(buf)<4096)buf[strlen(buf)]=0;
  34.   ous<<buf;
  35. }
  36. ous.close();
  37. int wsaerr=WSAGetLastError();
  38. std::cout<<wsaerr<<std::endl;
  39. }
复制代码
 楼主| 发表于 2008-1-17 18:54:51 | 显示全部楼层
  1. void main(int argc, char* argv[])
  2. {
  3. WORD version = MAKEWORD(1,1);
  4. WSADATA wsaData;
  5. int err = WSAStartup(version,&wsaData);
  6. if(err != 0)
  7.   return;
  8. if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
  9. {
  10.   WSACleanup();
  11.   return;
  12. }
  13. SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
  14. SOCKADDR_IN sockadrr;
  15. char *host_server = "www.163.com";
  16. hostent *pHost = gethostbyname(host_server);
  17. LPCSTR psz = inet_ntoa (*(in_addr*)pHost->h_addr_list[0]);
  18. sockadrr.sin_addr.S_un.S_addr = inet_addr(psz);
  19. sockadrr.sin_family = AF_INET;
  20. sockadrr.sin_port = htons(80);
  21. char *Command = "GET /index.html HTTP/1.1 \r\nHost: www.163.com\r\nAccept: image/gif \r\n\r\n";
  22. int len = sizeof(SOCKADDR);
  23. connect(sock, (SOCKADDR*)&sockadrr, len);
  24. send(sock, Command, strlen(Command), 0);
  25. std::ofstream ous("163com.html", std::ios::binary);
  26. char buf[4096];
  27. /*
  28.   std::cout<<strlen(buf)<<std::endl
  29.   而且这一句老是输出4104。。。
  30.   为什么啊?
  31.   用memset 一下就OK!
  32. */
  33. memset(buf, 0, 4096);
  34. while(recv(sock, buf, 4096, 0)>0)
  35. {
  36.   std::cout << strlen(buf) << std::endl;
  37.   if(strlen(buf) < 4096)
  38.    buf[strlen(buf)] = 0;
  39.   ous << buf;
  40.   memset(buf, 0, 4096);
  41. }
  42. ous.close();
  43. int wsaerr = WSAGetLastError();
  44. std::cout << wsaerr << std::endl;
  45. }
复制代码



看一看吧!已经没有问题了!HTTP协议是以TCP协议为基础的,记得TCP,不能用sendto
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-22 14:36 , Processed in 0.013040 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表