研究了一天这个玩意感觉挺有意思的。

刚开始是什么都不懂,现在写出来一段代码感觉略微有点意思了。

下面我分享一下学习过程和自己的理解。

整体过程大概就是如下情况:

先搜了一下别人的写这个东西的代码。

研究了一下代码中一些难理解的东西。慢慢就写出来了。

简单分析:

创建一个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语言获取网页源代码的学习所得的更多相关文章

  1. Java 网络爬虫获取网页源代码原理及实现

    Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...

  2. php查看网页源代码的方法

    这篇文章主要介绍了php查看网页源代码的方法,涉及php读取网页文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php查看网页源代码的方法.分享给大家供大家参考.具体实现 ...

  3. c#利用WebClient和WebRequest获取网页源代码的比较

    前几天举例分析了用asp+xmlhttp获取网页源代码的方法,但c#中一般是可以利用WebClient类和WebRequest类获取网页源代码.下面分别说明这两种方法的实现. WebClient类获取 ...

  4. delphi 获取网页源代码

    //获取网页源代码 var   s: string; begin   s := WebBrowser1.OleObject.document.body.innerHTML; //body内的所有代码 ...

  5. JS远程获取网页源代码的例子

    js代码获取网页源代码. 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> < ...

  6. 如何在ios手机端的Safari浏览器 中“查看网页源代码”

    在这里给大家分享一个很简单的用苹果手机无需越狱就可以查看网页源代码的方法,不过这个方法只用于苹果手机自带的Safari浏览器 随便添加一个safari 书签 (用于一会改为查看源码功能书签)进入书签 ...

  7. c#利用WebClient和WebRequest获取网页源代码

    C#中一般是可以利用WebClient类和WebRequest类获取网页源代码.下面分别说明这两种方法的实现.   WebClient类获取网页源代码   WebClient类   WebClient ...

  8. c#利用HttpWebRequest获取网页源代码

    c#利用HttpWebRequest获取网页源代码,搞了好几天终于解决了,直接获取网站编码进行数据读取,再也不用担心乱码了! 命名空间:Using System.Net private static ...

  9. C#用正则表达式 获取网页源代码标签的属性或值

    1.有url获取到网页源代码: using System.Web; using System.IO; using System.Net; private void GetHtmlinfo(string ...

随机推荐

  1. android文件系统挂载分析(1)---正常开机挂载

    未完,更新中 ... "android"系列分为三部分: 1.正常开机挂载 2.encryption 3.dm-verity 我们知道android有很多分区,如"sys ...

  2. 编写一个单独的Web Service for Delphi

    早段时间看了一篇好文章,对其整理成以下几步 1新建一个SOAP Server Application,在提示输入接口时输入MyHello,把所有文件保存在一个叫Ser的目录下,其中一个包含TWebMo ...

  3. 【数论】UVa 10586 - Polynomial Remains

    Problem F: Polynomial Remains Given the polynomial a(x) = an xn + ... + a1 x + a0, compute the remai ...

  4. sequence 作为序列插入值不是第一个

    CREATE SEQUENCE seq_test INCREMENT BY 1 START WITH 1 ; 创建表时 或执行  ALTER SYSTEM SET deferred_segment_c ...

  5. jquery里的宽度详解

    在jQuery中,width()方法用于获得元素宽度:innerWidth()方法用于获得包括内边界(padding)的元素宽度,outerWidth()方法用于获得包括内边界(padding)和边框 ...

  6. 安装SqlServer2008时相关问题

    在安装SqlServer2008时,安装程序支持规则,老提示重启计算机 1,运行 regedit 打开注册表编辑器. 2,依次展开HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ...

  7. jquery、js全选反选checkbox

    操作checkbox,全选反选 //全选 function checkAll() { $('input[name="TheID"]').attr("checked&quo ...

  8. response小结(五)—通过response实现请求重定向

    请求重定向指的是一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向.302状态码和location头即可实现重定向. 请求重定向最常见的应用场景就是用户登录. 下面 ...

  9. MDAC 在WINDOWS XP SP3 不能安装 的解决方法

    MDAC 在WINDOWS XP SP3 不能安装 的解决方法 解决步骤如下: c:/windows/inf 下找出mdac.inf 然后点右键->安装.在弹出提示路径选取c:/windows/ ...

  10. BUG修改纪录

    刚进入现在的公司,接手了一个遗留的项目,BUG频出,最近一个星期都在加班改BUG,身心疲惫,为了 现在,将来不会再被相同BUG困扰,特来纪录一下. 1.数据库设计字段时,对于int等类型最好设置默认值 ...