Socket是进程之间交换数据的机制。这些进程既可以是同一台机器上的,也可以是通过网络连接起来的不同机器。一旦一个Socket连接建立,那么数据就能够双向传输,直到其中一端关闭连接。
通常,请求数据的应用程序叫做客户端Client,而为请求服务叫做服务器Server。基本上说,首先,服务器监听一个端口,并且等待来自客户端的连接。之后客户端创建一个,并且尝试连接服务器。接着,服务器接受了来自客户端的连接,并且开始交换数据。一旦所有的数据都已经通过socket连接传输完毕,那么任意一方都可以关闭连接了。
我们的爬虫程序只需要client端就够了。

int build_connect(int *fd, char *ip, intport)
{  struct sockaddr_in server_addr;  bzero(&server_addr, sizeof(struct sockaddr_in));  server_addr.sin_family = AF_INET;  server_addr.sin_port = htons(port);  if (!inet_aton(ip, &(server_addr.sin_addr))) {  return -1;  }  if ((*fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {  return -1;  }  if (connect(*fd, (struct sockaddr *)&server_addr, sizeof(structsockaddr_in)) < 0) {  close(*fd);  return -1;  }  return 0;
}
void * recv_response(void * arg)
{  begin_thread();  int i, n, trunc_head = 0, len = 0;  char * body_ptr = NULL;  evso_arg * narg = (evso_arg *)arg;  Response *resp = (Response *)malloc(sizeof(Response));  resp->header = NULL;  resp->body = (char *)malloc(HTML_MAXLEN);  resp->body_len = 0;  resp->url = narg->url;  regex_t re;  if (regcomp(&re, HREF_PATTERN, 0) != 0) {/* compile error */  SPIDER_LOG(SPIDER_LEVEL_ERROR, "compile regex error");  }  SPIDER_LOG(SPIDER_LEVEL_INFO, "Crawling url: %s/%s",narg->url->domain, narg->url->path);  while(1) {  /* what if content-length exceeds HTML_MAXLEN? */  n = read(narg->fd, resp->body + len, 1024);  if (n < 0) {  if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {  /** * TODO: Why always recvEAGAIN? * should we deal EINTR */  //SPIDER_LOG(SPIDER_LEVEL_WARN,"thread %lu meet EAGAIN or EWOULDBLOCK, sleep", pthread_self());  usleep(100000);  continue;  }  SPIDER_LOG(SPIDER_LEVEL_WARN, "Read socket fail: %s",strerror(errno));  break;  } else if (n == 0) {  /* finish reading */  resp->body_len = len;  if (resp->body_len > 0) {  extract_url(&re,resp->body, narg->url);  }  /* deal resp->body */  for (i = 0; i < (int)modules_post_html.size(); i++) {  modules_post_html[i]->handle(resp);  }  break;  } else {  //SPIDER_LOG(SPIDER_LEVEL_WARN, "read socket ok! len=%d", n);  len += n;  resp->body[len] = '\0';  if (!trunc_head) {  if ((body_ptr =strstr(resp->body, "\r\n\r\n")) != NULL) {  *(body_ptr+2) = '\0';  resp->header =parse_header(resp->body);  if(!header_postcheck(resp->header)) {  goto leave; /* moduluesfilter fail */  }  trunc_head = 1;  /* cover header */  body_ptr += 4;  for (i = 0; *body_ptr; i++){  resp->body[i] =*body_ptr;  body_ptr++;  }  resp->body[i] = '\0';  len = i;  }  continue;  }  }  }  leave:  close(narg->fd); /* close socket */  free_url(narg->url); /* free Url object */  regfree(&re);/* free regex object */  /* free resp */  free(resp->header->content_type);  free(resp->header);  free(resp->body);  free(resp);  end_thread();  return NULL;
}  

网络爬虫二十二-爬虫socket处理相关推荐

  1. python爬虫进阶案例,Python进阶(二十)-Python爬虫实例讲解

    #Python进阶(二十)-Python爬虫实例讲解 本篇博文主要讲解Python爬虫实例,重点包括爬虫技术架构,组成爬虫的关键模块:URL管理器.HTML下载器和HTML解析器. ##爬虫简单架构 ...

  2. 网络存储技术Windows server 2012 (项目二十二 远程异地灾备中心的部署)

    网络云存储技术Windows server 2012 (项目二十二 远程异地灾备中心的部署) 前言 网络存储技术,是以互联网为载体实现数据的传输与存储,它采用面向网络的存储体系结构,使数据处理和数据存 ...

  3. Unity C# 网络学习(十二)——Protobuf生成协议

    Unity C# 网络学习(十二)--Protobuf生成协议 一.安装 去Protobuf官网下载对应操作系统的protoc,用于将.proto文件生成对应语言的协议语言文件 由于我使用的是C#所以 ...

  4. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  5. GUI的演化和python编程——Python学习笔记之二十二

    GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...

  6. Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Class

    Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Classi ...

  7. LINUX学习基础篇(二十二)硬盘结构

    LINUX学习基础篇(二十二)文件系统管理 硬盘 磁盘结构 硬盘接口 硬盘 磁盘结构 扇区是磁盘的最小存储单位,每个扇区的大小是固定的,为512Byte.硬盘里有多个磁盘,每个磁盘中,有多个同心圆,这 ...

  8. OpenCV C++案例实战二十二《手势识别》

    OpenCV C++案例实战二十二<手势识别> 前言 一.手部关键点检测 1.1 功能源码 1.2 功能效果 二.手势识别 2.1算法原理 2.2功能源码 三.结果显示 3.1功能源码 3 ...

  9. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  10. 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........

    4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...

最新文章

  1. Visual C++ 2011-6-6
  2. 2018刑侦推理 java_2018年刑侦科目推理试题
  3. 120余家自动驾驶公司的行业汇总
  4. 查看eclipse使用的jre版本
  5. 一些有价值的数值公式(游戏)
  6. Java网络编程之通过代码实现Socket通信
  7. 美国国际集团(AIG-American International Group)
  8. IDEA 之because it is included into a circular dependency循环依赖的解决办法
  9. Little VGL + code::blocks + 模拟器
  10. 关于Euler-Poisson积分的几种解法
  11. 标准差 php,标准偏差怎么算
  12. Web前端大作业 HTML+CSS+JS 防天天生鲜官网 9页
  13. Centos7安装SCL源
  14. 智慧社区安防核心硬件:无障碍人脸识别终端
  15. 农村土地确权之调查公示 —— 地块分布图制作说明
  16. visionpro的无脚本和高级脚本(你要偷偷的卷,然后惊艳所有人)
  17. android 常用机型尺寸_Android中获取手机屏幕大小的方法
  18. kuangbin专题八 HDU4009 Transfer water (无定根最小树形图)
  19. 程序化广告欺诈流量过滤方法
  20. 权益证明问题 —— Proof of Stake FAQ

热门文章

  1. 苹果注定要输给欧盟,USB-C成为标准接口已是大势所趋
  2. 【Java高级程序设计学习笔记】深入理解jdk动态代理
  3. VVC代码阅读(2)compressGOP函数(2)
  4. 最详细的Cydia使用教程------完全版。新补充Cydia1.1.1离线安装(升级)方法。
  5. python烟花教程_干货教程:Python欠你一场浪漫烟花邂逅
  6. linux tar:谨慎地拒绝创建空归档文件
  7. MyEclipse中maven的下载、配置及安装
  8. win7 无显示器 服务器,win7显示器无信号怎么办?电脑显示器无信号修复方法
  9. 中国互联网公司都要国际化,美图如何成为出海的另类?
  10. 暑假?不进厂?那就卷s同学吧