请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

ESFKAMI

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

ESFX

ESF: Xenoverse

ESF123

ESF1.2.3

EVM2.1

EVM2.1

ECXSSJ

ECX: TeamSSJ

ECX2.2

ECX RC2

ECX2.3

ECX RC3

查看: 1325|回复: 0

[C]获取网页源码|Get Webpage data

[复制链接]

211

主题

216

帖子

1176

积分

ESFKAMI

Rank: 8Rank: 8

积分
1176
发表于 2017-7-14 16:52:27 | 显示全部楼层 |阅读模式

by 努力喵

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <winsock2.h>

  5. #pragma comment(lib, "ws2_32.lib")


  6. int geturl(char *url)
  7. {
  8.     /****************解析URL,解析资源名、主机名********************/
  9.     const char *parseptr1;
  10.     const char *parseptr2;
  11.     char host[BUFSIZ];
  12.     char resource[BUFSIZ];
  13.     int len, i;
  14.    
  15.     parseptr2 = url;
  16.    
  17.     parseptr1 = strstr(parseptr2, "http://");
  18.     if(NULL == parseptr1)           //解析用户输入URL形式如[]"www.baidu.com" 情况
  19.     {
  20.         parseptr1 = strchr(parseptr2, '/');
  21.         len = parseptr1 - parseptr2;
  22.         if(NULL == parseptr1) //解析主机、资源名[]
  23.         {
  24.             strcpy(host, parseptr2);
  25.             strcpy(resource, "/");
  26.         }
  27.         else     //解析用户输入URL形式如[]"www.baidu.com/xxx"情况
  28.         {
  29.             for(i = 0; i < len; i++)
  30.             {
  31.                 host = parseptr2;//解析主机名[]
  32.             }
  33.             host[len] = '\0';
  34.             for(i = 0; i < len; i++)
  35.             {
  36.                 parseptr2++;
  37.             }
  38.             strcpy(resource, parseptr2);//解析资源名[]
  39.         }
  40.         printf("host: %s\nresouce: %s\n", host, resource);
  41.     }
  42.     else
  43.     {
  44.         parseptr1 = strchr(parseptr2, ':');  //解析用户输入URL形式如[]"http://www.baidu.com"情况
  45.         len = parseptr1 - parseptr2;
  46.         printf("protocol: ");   //解析协议[]
  47.         for(i = 0; i < len; i++)
  48.         {
  49.             printf("%c", parseptr2);
  50.         }
  51.         for(i = 0; i < 3; i++)
  52.         {
  53.             parseptr1++;
  54.         }
  55.         parseptr2 = parseptr1;
  56.         parseptr1 = strchr(parseptr2, '/');
  57.         len = parseptr1 - parseptr2;
  58.         if(NULL == parseptr1)
  59.         {
  60.             strcpy(host, parseptr2);     //解析主机名[]
  61.             strcpy(resource, "/");       //解析资源名[]
  62.         }
  63.         else   //解析用户输入URL形式如[]"http://www.baidu.com/xxx.."情况
  64.         {
  65.             for(i = 0; i < len; i++)
  66.             {
  67.                 host = parseptr2;
  68.             }
  69.             host[len] = '\0';
  70.             parseptr2 = parseptr1;
  71.             strcpy(resource, parseptr2);
  72.         }
  73.         
  74.         printf("\nhost: %s\nresource: %s\n", host, resource);
  75.     }
  76.    
  77.     /*****************创建socket************/
  78.     //初始化套接字[]
  79.     WSADATA wsaData;
  80.     WSAStartup(MAKEWORD(2,2), &wsaData);
  81.    
  82.     //创建套接字[]
  83.     SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  84.     if(sock == INVALID_SOCKET)
  85.     {
  86.         printf("Failed socket().\n");
  87.         WSACleanup();
  88.         return 0;
  89.     }
  90.    
  91.     //设置socket参数[]
  92.     struct sockaddr_in sockAddr;
  93.     memset(&sockAddr, 0, sizeof(sockAddr));
  94.     sockAddr.sin_family = AF_INET;
  95.     sockAddr.sin_port = htons(80);
  96.    
  97.     //获取主机名和地址信息[]
  98.     struct hostent *hp = gethostbyname(host);
  99.     if(hp == NULL)
  100.     {
  101.         printf("Can not find host address.\n");
  102.         return 0;
  103.     }
  104.     sockAddr.sin_addr.s_addr = *((unsigned long *)hp->h_addr);
  105.    
  106.     //连接到服务器[]
  107.     if(connect(sock, (SOCKADDR *)&sockAddr, sizeof(sockAddr)) == -1)
  108.     {
  109.         printf("Failed connect().\n");
  110.         WSACleanup();
  111.         return 0;
  112.     }
  113.    
  114.    
  115.     /****************与服务器通信,收发数据[]***************/
  116.     //准备发送数据[]
  117.     char request[BUFSIZ] = "";
  118.     //request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";
  119.     strcat(request, "GET ");
  120.     strcat(request, resource);
  121.     strcat(request, " HTTP/1.1\r\nHost:");
  122.     strcat(request, host);
  123.     strcat(request, "\r\nConnection:Close\r\n\r\n");
  124.    
  125.     //发送数据[]
  126.     if(SOCKET_ERROR==send(sock, request, sizeof(request), 0))
  127.     {
  128.         printf("Send error.\n");
  129.         closesocket(sock);
  130.         return 0;
  131.     }
  132.    
  133.     //接收数据[]
  134.     static char pageBuf[BUFSIZ];
  135.     printf("Read: ");
  136.     int ret = 1;
  137.     while(ret > 0)
  138.     {
  139.         ret = recv(sock, pageBuf, BUFSIZ, 0);
  140.         printf("%s", pageBuf);
  141.         strnset(pageBuf, '\0', BUFSIZ);
  142.     }
  143.    
  144.     closesocket(sock);
  145.     WSACleanup();
  146.     return 0;
  147. }

  148. int main(int argc, char *argv[])
  149. {
  150.     char url[256];
  151.     puts("Enter URL:");
  152.     scanf("%s", url);
  153.     geturl(url);
  154.     return 0;
  155. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|ESFKAMI    

GMT+8, 2018-6-25 04:19 , Processed in 0.268313 second(s), 22 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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