(原创)socket学习实验(一)——利用C 语言socket抓取一个网页内容

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

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

这样就通过telnet抓取到一个网页,而利用socket也是如此,只是发送消息时将消息格式给变一下,就能实现这个功能:而我是将抓取的网页内容写到一个临时的html文件里,这样就可以将抓取的网页文件在浏览器中打开了,代码贴出:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <fcntl.h>
#define PORT 80
//char *cmd = "GET / HTTP/1.1 \nhost:www.xust.edu.cn";


int main(int arg,char **argc)
{
    printf("11111111\n");
    int sockfd;
    int fd;
    struct sockaddr_in servaddr;
    char buf[1024] ;
    char tmp1[100];
    char cmd[1024];
    //char *cmd="GET /uid/30510400.html HTTP/1.1\r\nhost:blog.chinaunix.net\r\n\r\n";
    struct hostent *host;
    int n=0;
        
    if((fd = open("text.html",O_CREAT|O_TRUNC|O_WRONLY)) < 0){
        fprintf(stderr,"open error:%s\n",strerror(errno));
        return -1;
    }

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

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

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


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

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

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

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

    bzero(&servaddr,sizeof(servaddr));

    servaddr.sin_family = AF_INET;

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

    servaddr.sin_port = htons(PORT);

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

 
    if(send(sockfd,cmd,strlen(cmd),0) < 0){
        fprintf(stderr,"send error:%s\n",strerror(errno));
        return -1;
    }
 
    while(1){
        if(recv(sockfd,buf,2048,0) < 1)
          break;

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

    }
    close(sockfd);
close(fd);
    printf("bye!\n");
    return -1;

}

gcc编译之后运行:

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

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

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(91) | 评论(0) | 转发(0) |
0

上一篇:linux内核——进程管理

下一篇:Linux 同步方法剖析--内核原子,自旋锁和互斥锁

相关热门文章
  • linux 常见服务端口
  • xmanager 2.0 for linux配置
  • 【ROOTFS搭建】busybox的httpd...
  • openwrt中luci学习笔记
  • 什么是shell
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
原创粉丝点击