设为首页 加入收藏

TOP

C++写的socket网络爬虫(四)
2014-04-06 17:35:03 来源: 作者: 【 】 浏览:429
Tags:socket 网络 爬虫

 

  一、main函数

  1、makeSocket(url,port)

  int makeSocket(string host,int port)函数是我自己编写的,接受两个参数,一个是域名或主机名,第二个是所使用的端口号,返回一个用于创建socket的int型数据,将在这一页的二.makeSocket中进行讲解

  2、string request = "GET " + name + " HTTP/1.1\r\nHost:" + url + "\r\nConnection:Close\r\n\r\n";

  这个是http的请求报头,有很多的信息,这里只对这句话中使用到的进行讲解

  GET 请求获取Request-URI所标识的资源;

  name 所标识的资源;

  HTTP/1.1 表示请求的HTTP协议版本;

  Host:url 指定被请求资源的Internet主机和端口号,通常从HTTP URL中提取出来的,

  比如 我们在浏览器中输入http://baidu.com/index.html浏览器发送的请求消息中,就会包含Host请求报头域,如下:

  Host:www.baidu.com

  此处使用缺省端口号80,若指定了端口号,则变成:Host:www.baidu.com:port

  Connection:Close Connection字段用于设定是否使用长连接,在http1.1中默认是使用长连接的,即Connection的值为Keep-alive,如果不想使用长连接则需要明确指出connection的值为close

  Connection:Close表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了,即必须从新创建socket

  更多关于http协议的内容可以查考http://blog.csdn.net/gueter/article/details/1524447 HTTP协议详解

  注意最后一定要以一个单独的\r\n作为结束标志

  3.send/recv

  send用于向服务端发送消息

  recv/send函数原型如下

  int recv(SOCKET s,char FAR * buf,int len,int flags)/int send(SOCKET s,const char FAR * buf,int len,int flags);

  第一个参数表示代表对方的socket,

  第二个参数为接收读取的信息的字符串

  第三个参数为该字符串的大小

  第四个参数可以用来控制读写操作

  详情可以参照http://www.cnblogs.com/magicsoar/p/3587351.html 中的讲解1

  4 FileName(name)

  自己编写的string FileName(string dir)函数,由于windows中文件的名字中不允许含有/

  所以FileName函数用于将dir中的所有/替换为_

  string FileName(string dir)

  {

  string search = "/";

  int pos = 0;

  while ((pos = dir.find(search, pos)) != string::npos) {

  dir.replace(pos, search.size(), "_");

  pos++;

  }

  return dir;

  }

  如string FileName(“img/bdlogo.gif”)返回_img_bdlogo.gif

  5 file.open(fileName, ios::out | ios::binary)r45

  ios::out以输出方式打开文件,如果文件不存在这创建新的文件

  ios::binary以二进制模式进行I/O操作,这里使用二进制模式是为了正确的处理图片的下载

  6 ::memset(buf, 0, sizeof(buf));

  函数原型为void *memset(void *s, int ch, size n);

  函数解释:将s所指的内存中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。

  memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体和数组进行清零操作的一种较快方法

  7 在接收和解释请求消息后,服务器返回一个HTTP响应消息。

  HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文

  响应正文就是服务器返回的资源的内容,所以我们需要跳过状态行与消息报头部分。

  消息报头与相应正文之间可以用\r\n\r\n进行区分,当第一次发现接收到的字符串数组中含有\r\n\r\n时,则将\r\n\r\n前的内容全部忽略,将剩下的内容写到文件中去

  strstr(*str1, *str2)实现从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回null。

  由于一次最多可以接受1024个字符,而\r\n极有可能位于中间位置,所有我们要将1024个char中位于\r\n之后的数据写到文件中。

        

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据结构内存管理c++实现 下一篇c++用迭代做直尺刻度

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)