C语言获取网页源代码的学习所得
研究了一天这个玩意感觉挺有意思的。
刚开始是什么都不懂,现在写出来一段代码感觉略微有点意思了。
下面我分享一下学习过程和自己的理解。
整体过程大概就是如下情况:
先搜了一下别人的写这个东西的代码。
研究了一下代码中一些难理解的东西。慢慢就写出来了。
简单分析:
创建一个socket套接字连接主机
发送GET报文头字符串
接收
存放
准备工作:
connect()和服务器建立连接
send() recv() 都是在利用套接字
用户提供一个网址,我们分析网址。
网址中包含的信息 有些是要填入sockaddr地址信息中 ,有些是要填入GET报头文
我们能得知信息有 主机名 资源路径 端口
例如一个 www.baidu.com/1.html 主机名www.baidu.com 资源路径 /1.html 端口没有 就 默认 80
建立连接 connect()函数搞定
参数中需要socket 和 sockaddr 前者就是套接字,后者是一个套接字地址结构
可以从sockaddr_in 强制转化过来 这个是另一种套接字地址结构体
需要提供 端口和 ip地址
端口 我们分析网址就能得到
ip地址 是用gethostbyname()这个函数搞定
函数名就挺形象的 通过主机名字获得host信息
意思就是 从 www.baidu.com 主机名 获得host信息
然后我们从信息里面把ip地址提取出来
GET报文头 需要主机名 资源路径 这两样网址中都提供了
发送 send()这个函数搞定
接收 recv()这个函数搞定
细分逻辑:
主要是学习这些函数以及结构的过程,和一些简单的逻辑组织。
分析网址 这个都在string.h
从host结构中获得ip地址填入套接字地址结构 这个查阅一下gethostbyname()和sockaddr以及sockaddr_in
连接connect()
存放GET报文头,把报文头用字符串函数组建起来,放在数组或者其他。。
发送send()
如果你发送的GET报文头得到了回应,目标就会传送你要的信息回来
接收recv()
信息可能很多,可能不能一次性接收完,分多次。用memcpy()和malloc()以及realloc()
memcpy() copy字节数到目标 malloc()声明一定大小的内存区域 realloc()改变内存区域大小
什么时候接收完 如果套接字中有接收的内容就一直接收。没有就等待,直到超时,然后返回0.
这个超时时间限定是可以设置的。setsockopt()这个函数。可以设置接收和发送
int nNetTimeout = 5000;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
遗留问题的思考:对于接收到数据处理。编码问题。我觉得套接字中传输的是数据,不是字符串。
正文这个我觉得倒是好理解,有人用utf8写了一个html网页文件保存在服务器,我们所获取的正文应该是这个用utf8编码写的数据 (我猜的)
但是接收到的报文头是什么编码呢,我们用什么简单的方法把它们分离,没有去研究。。有机会再看看
C语言获取网页源代码的学习所得的更多相关文章
- Java 网络爬虫获取网页源代码原理及实现
Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...
- php查看网页源代码的方法
这篇文章主要介绍了php查看网页源代码的方法,涉及php读取网页文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php查看网页源代码的方法.分享给大家供大家参考.具体实现 ...
- c#利用WebClient和WebRequest获取网页源代码的比较
前几天举例分析了用asp+xmlhttp获取网页源代码的方法,但c#中一般是可以利用WebClient类和WebRequest类获取网页源代码.下面分别说明这两种方法的实现. WebClient类获取 ...
- delphi 获取网页源代码
//获取网页源代码 var s: string; begin s := WebBrowser1.OleObject.document.body.innerHTML; //body内的所有代码 ...
- JS远程获取网页源代码的例子
js代码获取网页源代码. 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < ...
- 如何在ios手机端的Safari浏览器 中“查看网页源代码”
在这里给大家分享一个很简单的用苹果手机无需越狱就可以查看网页源代码的方法,不过这个方法只用于苹果手机自带的Safari浏览器 随便添加一个safari 书签 (用于一会改为查看源码功能书签)进入书签 ...
- c#利用WebClient和WebRequest获取网页源代码
C#中一般是可以利用WebClient类和WebRequest类获取网页源代码.下面分别说明这两种方法的实现. WebClient类获取网页源代码 WebClient类 WebClient ...
- c#利用HttpWebRequest获取网页源代码
c#利用HttpWebRequest获取网页源代码,搞了好几天终于解决了,直接获取网站编码进行数据读取,再也不用担心乱码了! 命名空间:Using System.Net private static ...
- C#用正则表达式 获取网页源代码标签的属性或值
1.有url获取到网页源代码: using System.Web; using System.IO; using System.Net; private void GetHtmlinfo(string ...
随机推荐
- Objective-C ,ios,iphone开发基础:picker控件详解与使用,(实现省市的二级联动)
第一步:新建一个单视图(single view)的工程, 命名为pickerTest,不要勾选下面两个选项,第一个是新版本里面的,第二个是单元测试,现在用不着. 点击next ->creat之 ...
- [改善Java代码]不要在构造函数中抛出异常
Java的异常机制有三种: 一.Error类以及其子类表示的是错误,它是不需要程序员处理也不能处理的异常.比如VirtualMachineError虚拟机错误,ThreadDeath线程僵尸等. 二. ...
- 关于JDK中采用单例模式的类
JDK设计模式应用——单例模式(Singleton) <JDK源码分析>的分支,讲解设计模式在jdk中使用. 我们从三个方面讲述,一是:jdk源码中的设计模式:二是:讲解设计模式(UML图 ...
- The Signals Of Process Communication
在之前大概的概述了进程之间的通信,下面笔者具体述说一下进程通信中最古老的一种通信方式之一---信号(Signals ),信号是用户进程之间通信和同步的一种原始机制,操作系统通过信号来通知进程系统中发生 ...
- 【杨氏矩阵+勾长公式】POJ 2279 Mr. Young's Picture Permutations
Description Mr. Young wishes to take a picture of his class. The students will stand in rows with ea ...
- hdu1565 网络流或状态压缩DP
对于网络流有一个定理: 最小点权覆盖集=最大网络流: 最大点权独立集=总权值-最小点权覆盖集: 网络流解法代码如下: #include<cstdio> #include<iostre ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- JMS - 消息确认
消息确认机制 消息确认协议是保证消息传送的关键所在,同时,支持确认也是 JMS API 语义的要求.以下将分别从消息生产者.消息服务器.消息消费者的角度,来考察消息确认机制. 从消息生产者的角度考察 ...
- 第十篇、微信小程序-view组件
视图容器 常用的样式的属性: 详情:http://www.jianshu.com/p/f82262002f8a display :显示的模式.可选项有:flex(代表view可以伸缩,弹性布局)- f ...
- 第二十八篇、自定义的UITableViewCell上有图片需要显示,要求网络网络状态为WiFi时,显示图片高清图;网络状态为蜂窝移动网络时,显示图片缩略图
1)SDWebImage会自动帮助开发者缓存图片(包括内存缓存,沙盒缓存),所以我们需要设置用户在WiFi环境下下载的高清图,下次在蜂窝网络状态下打开应用也应显示高清图,而不是去下载缩略图. 2)许多 ...