• C语言之socket获取网页源码


      写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言。但你有没有想过使用C语言来实现呢?我曾经以为用c来实现获取网页源码是很复杂的,要自己按照http等协议来构造包,再解析接受到的包,还要考虑三次握手。现在想来当时的想法真可怕啊!一个人最崇敬科技,最害怕科学的时候是期是何时呢?是当他懂了一些东西,但还有一大堆东西不懂的时候。也许脑筋转一个弯,他学的就快了。好了,下面进入正题:

      通过socket与远程连接需要ip和端口号,通常我们写的socket程序都是一个server,一个client,两个配对,单一可以只写一方的程序来达到我们的目的:如端口扫描。我们把web服务器当成socket服务端(实际也的确如此,网络通信不都是socket的天下吗),端口设为80(开放网站大多都是这个啊)。步骤有三:

    1. 创建socket,建立connect
    2. 向对方发送请求
    3. 读取响应内容
    int open_socket(char* host,char *port){
        struct addrinfo *res;//<netdb.h>
        struct addrinfo hints;
        memset(&hints,0,sizeof(hints));
        hints.ai_family=PF_UNSPEC;// AF | PF
        hits.ai_socktype=SOCK_STREAM;
        if(getaddrinfo(host,port,&hints,&res)==-1)//会在堆上创建一种叫名字资源的新数据结构
             perror("error");
        int d_sock=socket(res->ai_family,res->ai_socktype,res->ai_protocal);
        if(d_sock==-1) perror...
        int c=connect(d_sock,res->ai_addr,res->ai_addrlen);
        freeaddrinfo(res);//释放堆空间
        if(c==-1) ...
        return d_sock;
    }

    下面是一个发送信息的辅助函数

    int say(int sock,char *s){
        int ret=send(sock,s,strlen(s),0);
        if(ret==-1) perror...
        return ret;
    }
    上面的perror函数是系统的,可以换成你自定义的,或者用strerror()加上<errno.h>中的errno
    发送信息至少包含三部分:
      GET请求,主机名,空行(
    )
    下面是main函数:
    int main(int a,char *b){
      int sock;
      soc=open_sock("www.sougou.com","80");
      char rec[256];
      say(sock,"GET /wiki/ http/1.1
    ");
      int bytesRcvd=recv(sock,rec,255,0);
      while(bytesRcvd){
        if(bytesRcvd==-1) ...
        rec[bytesRcvd]='';
        printf("%s",rec);
        bytesRcvd=recv(sock,rec,255,0);
      }
      close(sock);
      return 0;
    }
  • 相关阅读:
    log4j配置
    Fragment配合RadioGroup实现点击切换布局
    (转)[原] Android 自定义View 密码框 例子
    标题栏透明度变化
    Android 监听ScrollView的滑动
    Android进度条学习
    Android-正方形的容器
    Android添加图片到ListView或者 RecyclerView显示
    Android打开相机和打开相册
    2020新年快乐
  • 原文地址:https://www.cnblogs.com/makefile/p/3751445.html
Copyright © 2020-2023  润新知