找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 4100|回复: 3

【TCPIP】C语言通过Winsock下载网页内容的程序

[复制链接]
发表于 2014-3-12 23:54:21 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
用法是启动它然后输入URL(前缀必须是HTTP://)
HTTPBROW.PNG
不要在意乱码。因为我并没有对文字编码进行处理。遇到UTF-8就会出现乱码。
但是它实现了浏览器最基本的功能:访问服务器,得到网页。
这里是代码,请收下。
  1. #include<stdio.h>
  2. #include<winsock2.h>

  3. #define BUF_SIZE 0x2000

  4. int main(int argc,char**argv)
  5. {
  6.     WSADATA wsaData;
  7.     char szUrl[0x1000]={0};
  8.     char szBuf[BUF_SIZE+1]={0};
  9.     if(WSAStartup(WINSOCK_VERSION,&wsaData))
  10.     {
  11.         fputs("初始化Winsock失败。\n",stderr);
  12.         return 1;
  13.     }
  14.     for(;;)
  15.     {
  16.         char *pDir=NULL;
  17.         struct hostent* hAddr=NULL;
  18.         SOCKADDR_IN sAddr={0};
  19.         SOCKET sConnect=INVALID_SOCKET;
  20.         int nSendLen=0;
  21.         int nRecv=0;
  22.         printf("请输入网址。\n");
  23.         gets(szUrl);
  24.         if(!strlen(szUrl))
  25.         {
  26.             fputs("没有输入网址,程序退出。\n",stderr);
  27.             goto BadEnd;
  28.         }
  29.         if(strnicmp(szUrl,"http://",7))
  30.         {
  31.             fputs("请输入以http://开头的网址……\n",stderr);
  32.             continue;
  33.         }
  34.         if(pDir=strchr(szUrl+7,'/'))
  35.         {
  36.             *pDir++=0;
  37.             printf("网址:%s\n目录:%s\n",szUrl+7,pDir);
  38.         }
  39.         else
  40.             printf("网址:%s\n",szUrl+7);
  41.         hAddr=gethostbyname(szUrl+7);
  42.         if(!hAddr)
  43.         {
  44.             fprintf(stderr,"域名解析失败。\nWSAGetLastError=%u\n",WSAGetLastError());
  45.             continue;
  46.         }
  47.         printf("目标IP地址:%u.%u.%u.%u\n",
  48.             (unsigned char)(hAddr->h_addr_list[0][0]),
  49.             (unsigned char)(hAddr->h_addr_list[0][1]),
  50.             (unsigned char)(hAddr->h_addr_list[0][2]),
  51.             (unsigned char)(hAddr->h_addr_list[0][3]));
  52.         sAddr.sin_family=AF_INET;
  53.         sAddr.sin_port=htons(80);
  54.         sAddr.sin_addr.s_addr=*(u_long*)(hAddr->h_addr_list[0]);
  55.         sConnect=socket(AF_INET,SOCK_STREAM,0);
  56.         if(sConnect==INVALID_SOCKET)
  57.         {
  58.             fprintf(stderr,"无法创建SOCKET套接字。\nWSAGetLastError=%u\n",WSAGetLastError());
  59.             goto BadEnd;
  60.         }
  61.         if(connect(sConnect,(SOCKADDR*)&sAddr,sizeof(sAddr)))
  62.         {
  63.             fprintf(stderr,"无法连接。\nWSAGetLastError=%u\n",WSAGetLastError());
  64.             closesocket(sConnect);
  65.             continue;
  66.         }
  67.         if(!pDir)
  68.             pDir="";
  69.         sprintf(szBuf,
  70.             "GET /%s HTTP/1.1\n"
  71.             "Accept: text/html, application/xhtml+xml, */*\n"
  72.             "Accept-Language: zh-CN\n"
  73.             "User-Agent: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko\n"
  74.             //"Accept-Encoding: gzip, deflate\n"
  75.             "Host: %s\n"
  76.             "DNT: 1\n"
  77.             "Connection: Keep-Alive\n"
  78.             "\n"
  79.             ,pDir,szUrl+7);
  80.         nSendLen=strlen(szBuf)+1;
  81.         if(send(sConnect,szBuf,nSendLen,0)!=nSendLen)
  82.             fprintf(stderr,"不能完整发送数据包。\nWSAGetLastError=%u\n",WSAGetLastError());
  83.         do
  84.         {
  85.             memset(szBuf,0,BUF_SIZE);
  86.             nRecv=recv(sConnect,szBuf,BUF_SIZE,0);
  87.                         if(nRecv==SOCKET_ERROR)
  88.                                 nRecv=BUF_SIZE;
  89.                         fwrite(szBuf,1,nRecv,stdout);
  90.             printf("%s",szBuf);
  91.         }while(nRecv==BUF_SIZE);
  92.                 puts("\n");
  93.         closesocket(sConnect);
  94.     }
  95.     WSACleanup();
  96.     return 0;
  97. BadEnd:
  98.     WSACleanup();
  99.     return 1;
  100. }
复制代码
这里是工程文件的下载地址。
游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

KxIX 该用户已被删除
发表于 2014-3-12 23:56:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2014-3-13 01:18:30 | 显示全部楼层
这东西可以拿来做浏览器了
回复 赞! 靠!

使用道具 举报

发表于 2014-3-13 07:19:15 | 显示全部楼层
系统自动回复
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-1 07:52 , Processed in 0.040864 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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