Chinaunix首页 | 论坛 | 博客
  • 博客访问: 149337
  • 博文数量: 37
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 125
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-28 11:52
个人简介

回首向来萧瑟处,也无风雨也无晴

文章存档

2016年(1)

2015年(36)

我的朋友

分类: LINUX

2015-11-20 10:27:15

(纯手打,有问题可以交流)
最近在学习socket,然后做了一些小的实验,发现socket功能还真是强大,对于socket流使套接字在某种程度上其实是与终端的telnet相似的,IP地址对应socket里的sock地址,端口对应sock里的端口,然后就看自己在终端里发送命令,就如同利用socket的send和recv方法了,
我在终端上测试一个telnet,获取一个网页的内容:
~:telnet 80                    //首先进入到telnet
输入:GET / HTTP/1.1
输入:host bolg.chinaunix.net

回车后再按一次回车,就能获取网页代码:数量太大,仅仅粘贴一部分:

这样就通过telnet抓取到一个网页,而利用socket也是如此,只是发送消息时将消息格式给变一下,就能实现这个功能:而我是将抓取的网页内容写到一个临时的html文件里,这样就可以将抓取的网页文件在浏览器中打开了,代码贴出:

点击(此处)折叠或打开

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #define PORT 80
  10. //char *cmd = "GET / HTTP/1.1 \nhost:";


  11. int main(int arg,char **argc)
  12. {
  13.     printf("11111111\n");
  14.     int sockfd;
  15.     int fd;
  16.     struct sockaddr_in servaddr;
  17.     char buf[1024] ;
  18.     char tmp1[100];
  19.     char cmd[1024];
  20.     //char *cmd="GET /uid/30510400.html HTTP/1.1\r\nhost:blog.chinaunix.net\r\n\r\n";
  21.     struct hostent *host;
  22.     int n=0;
  23.         
  24.     if((fd = open("text.html",O_CREAT|O_TRUNC|O_WRONLY)) < 0){
  25.         fprintf(stderr,"open error:%s\n",strerror(errno));
  26.         return -1;
  27.     }

  28.     if(arg != 2 ){
  29.         fprintf(stderr,"usage:./a.out IPaddress:%s\n",strerror(errno));
  30.         return -1;
  31.     }

  32.     printf("enter the web page path you want to grub,and if you want the all press enter key ");

  33.     fgets(tmp1,100,stdin);
  34.     tmp1[strlen(tmp1) - 1] = '\0';


  35.     sprintf(cmd,"GET /%s HTTP/1.1\r\nhost:%s\r\n\r\n",tmp1,argc[1]);
  36.     if((host = gethostbyname(argc[1])) == NULL){
  37.         fprintf(stderr,"get host by name error:%s\n",strerror(errno));
  38.         return -1;
  39.     }

  40.     printf("hostname:%s\n",host->h_name);

  41.     if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){
  42.         fprintf(stderr,"socket creat error :%s\n",strerror(errno));
  43.         return -1;
  44.     }

  45.     
  46.     if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&n,sizeof(n)) < 0){
  47.         fprintf(stderr,"set sock option error:%s\n",strerror(errno));
  48.         return -1;
  49.     }

  50.     bzero(&servaddr,sizeof(servaddr));

  51.     servaddr.sin_family = AF_INET;

  52. // servaddr.sin_addr = *((struct in_addr *)host->h_addr);
  53.     servaddr.sin_addr = *((struct in_addr *)host->h_addr);

  54.     servaddr.sin_port = htons(PORT);

  55.     if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0){
  56.         fprintf(stderr,"connect error:%s\n",strerror(errno));
  57.         return -1;
  58.     }

  59.   
  60.     if(send(sockfd,cmd,strlen(cmd),0) < 0){
  61.         fprintf(stderr,"send error:%s\n",strerror(errno));
  62.         return -1;
  63.     }
  64.  
  65.     while(1){
  66.         if(recv(sockfd,buf,2048,0) < 1)
  67.           break;

  68.         write(fd,buf,strlen(buf));

  69.     }
  70.     close(sockfd);
  71. close(fd);
  72.     printf("bye!\n");
  73.     return -1;

  74. }



gcc编译之后运行:

因为我想抓取我博客中的一篇文章,网址是这个http://blog.chinaunix.net/uid-30510400-id-5378031.html,所以我输入:uid-30510400-id-5378031.html
最后在当前目录下就能看到text.html文件,用浏览器打开,便可以看到自己抓取的那个网页,

很神奇吧,可以尝试抓取一下哦!

阅读(3345) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~