`
vearne
  • 浏览: 18911 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用linux函数模拟HTTP 请求过程

 
阅读更多

非常好的参考资料

1.HTTP 协议资料

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2

2.使用telnet模拟浏览器访问网页

http://pcwanli.blog.163.com/blog/static/4531561120091115105240732/

 

 

#include "apue.h"
#include <netdb.h>
#include <errno.h>
#include <sys/socket.h>
#include <iostream>
using namespace std;

#define MAXADDRLEN 256
#define BUFLEN 128
#define MAXSLEEP 128
int connect_retry(int sockfd,const struct sockaddr* addr,socklen_t alen){
	int nsec;
	for(nsec =1; nsec <= MAXSLEEP;nsec <<=1){
		if(connect(sockfd,addr,alen)==0){
			return 0;

		}else {

			if(nsec <=MAXSLEEP/2){
				sleep(nsec);
			}
		}


	}
	return -1;
}
int main(){
	struct addrinfo hint;
	struct addrinfo *ailist;
	int err =0;	
	hint.ai_flags = 0;
	hint.ai_family =0;
	hint.ai_socktype = SOCK_STREAM;
	hint.ai_protocol = 0;
	hint.ai_addrlen =0;
	hint.ai_canonname = NULL;
	hint.ai_addr = NULL;
	hint.ai_next = NULL;
	if((err = getaddrinfo("www.baidu.com","80",&hint,&ailist))!=0){
		err_quit("getaddrinfo error:%s",gai_strerror(err));

	}
	struct addrinfo* aip = ailist;
	int sockfd = 0;
	if((sockfd = socket(aip->ai_family,SOCK_STREAM,0))<0){
		err = errno;	
		cout<<"ok"<<endl;
	}
	if(connect_retry(sockfd,aip->ai_addr,aip->ai_addrlen)<0){
		cout<<"ok2"<<endl;
		err = errno;
	}
	//connect ok
	//send request
	const char* reqs[]={"GET /index.htm HTTP/1.1\n","User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5\n","host:www.baidu.com\n","Accept-Charset:UTF-8\n","connection:close\n","\n"};
//	const char* req = "GET /index.htm HTTP/1.0\n\n";
	const char* req;
	for(int i=0;i<6;i++){
		req=reqs[i];
		send(sockfd,req,strlen(req),0);

	}
//	send(sockfd,req,strlen(req),0);
	char buf[BUFLEN];
	int n=0;
	while((n=recv(sockfd,buf,BUFLEN,0))>0){
		write(STDOUT_FILENO,buf,n);
	}
	cout<<"ok"<<endl;
	cout<<endl;
	close(sockfd);
}

 如需编译还需要《unix环境高级编程》的apue.h 和error.c

通过以上程序我们可以了解到

1.浏览器是通过User-Agent字段向服务器表明自己的身份的

2.通过实验表明http1.1协议下默认连接为长连接,且recv()默认为阻塞函数

    如果不设置connection:close此属性,则会在recv()上阻塞一段时间。

   是否我应该这样认为,也就是说一直没有收到字节流的终止标志。

 

 

获得的http响应

 

HTTP/1.1 200 OK
Date: Wed, 08 Aug 2012 06:45:00 GMT
Server: BWS/1.0
Content-Length: 8225
Content-Type: text/html;charset=gbk
Cache-Control: private
Expires: Wed, 08 Aug 2012 06:45:00 GMT
Set-Cookie: BAIDUID=D0607B2A1D830DE33C4A566154E9937B:FG=1; expires=Wed, 08-Aug-42 06:45:00 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Connection: Close

<!doctype html><html><head><meta http-equiv="Content-Type" content="text/html;charset=gb2312"><title>°Ù¶Èһϣ¬ÄãŸÍÖªµÀ      </title><style>html{overflow-y:auto}body{font:12px arial;text-align:center;background:#fff}body,p,form,ul,li{margin:0;padding:0;list-style:none}body,form,#fm{position:relative}td{text-align:left}img{border:0}a{color:#00c}a:active{color:#f60}#u{color:#999;padding:4px 10px 5px 0;text-align:right}#u a{margin:0 5px}#u .reg{margin:0}#m{width:680px;margin:0 auto;}#nv a,#nv b,.btn,#lk{font-size:14px}#fm{padding-left:90px;text-align:left}input{border:0;padding:0}#nv{height:19px;font-size:16px;margin:0 0 4px;text-align:left;text-indent:117px;}.s_ipt_wr{width:418px;height:30px;display:inline-block;margin-right:5px;background:url(http://s1.bdstatic.com/r/www/cache/aoyun/img/i-1.0.1.png) no-repeat -304px 0;border:1px solid #b6b6b6;border-color:#9a9a9a #cdcdcd #cdcdcd #9a9a9a;vertical-align:top}.s_ipt{width:405px;height:22px;font:16px/22px arial;margin:5px 0 0 7px;background:#fff;outline:none;-webkit-appearance:none}.s_btn{width:95px;height:32px;padding-top:2px\9;font-size:14px;background:#ddd url(http://s1.bdstatic.com/r/www/cache/aoyun/img/i-1.0.1.png);cursor:pointer}.s_btn_h{background-position:-100px 0}.s_btn_wr{width:97px;height:34px;display:inline-block;background:url(http://s1.bdstatic.com/r/www/cache/aoyun/img/i-1.0.1.png) no-repeat -202px 0;*position:relative;z-index:0;vertical-align:top}#lg img{vertical-align:top;margin-bottom:3px}#lk{margin:33px 0}#lk span{font:14px "ËÎÌå"}#lm{height:60px}#lh{margin:16px 0 5px;word-spacing:3px}.tools{position:absolute;top:-4px;*top:10px;right:-13px;}#mHolder{width:62px;position:relative;z-index:296;display:none}#mCon{height:18px;line-height:18px;position:absolute;cursor:pointer;padding:0 18px 0 0;background:url(http://s1.bdstatic.com/r/www/img/bg-1.0.0.gif) no-repeat right -134px;background-position:right -136px\9}#mCon span{color:#00c;cursor:default;display:block}#mCon .hw{text-decoration:underline;cursor:pointer}#mMenu a{width:100%;height:100%;display:block;line-height:22px;text-indent:6px;text-decoration:none;filter:none\9}#mMenu,#user ul{box-shadow:1px 1px 2px #ccc;-moz-box-shadow:1px 1px 2px #ccc;-webkit-box-shadow:1px 1px 2px #ccc;filter: progid:DXImageTransform.Microsoft.Shadow(Strength=2, Direction=135, Color="#cccccc")\9;}#mMenu{width:56px;border:1px solid #9b9b9b;list-style:none;position:absolute;right:7px;top:28px;display:none;background:#fff}#mMenu a:hover{background:#ebebeb}#mMenu .ln{height:1px;background:#ebebeb;overflow:hidden;font-size:1px;line-height:1px;margin-top:-1px}#cp,#cp a{color:#77c}#seth{display:none;behavior:url(#default#homepage)}#setf{display:none;}#sekj{margin-left:14px;}</style>
<script type="text/javascript">function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('http://www.baidu.com/');}</script></head>

<body><div id="u"><a href="http://www.baidu.com/gaoji/preferences.html" name="tj_setting">ËÑË÷ÉèÖÃ</a>|<a href="https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" name="tj_login" id="lb" onclick="return false;">µÇÂŒ</a><a href="https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" target="_blank" name="tj_reg" class="reg">×¢²á</a></div>
<div id="m"><p id="lg"><img src="http://www.baidu.com/img/baidu_sylogo1.gif" width="270" height="129"></p>
<p id="nv"><a href="http://news.baidu.com">ÐÂ&nbsp;ÎÅ</a>¡¡<b>Íø&nbsp;Ò³</b>¡¡<a href="http://tieba.baidu.com">Ìù&nbsp;°É</a>¡¡<a href="http://zhidao.baidu.com">Öª&nbsp;µÀ</a>¡¡<a href="http://mp3.baidu.com">MP3</a>¡¡<a href="http://image.baidu.com">ÍŒ&nbsp;Ƭ</a>¡¡<a href="http://video.baidu.com">ÊÓ&nbsp;Ƶ</a>¡¡<a href="http://map.baidu.com">µØ&nbsp;ÍŒ</a></p><div id="fm"><form name="f" action="/s"><span class="s_ipt_wr"><input type="text" name="wd" id="kw" maxlength="100" class="s_ipt"></span><input type="hidden" name="rsv_bp" value="0"><input type="hidden" name="rsv_spt" value="3"><span class="s_btn_wr"><input type="submit" value="°Ù¶ÈÒ»ÏÂ" id="su" class="s_btn" onmousedown="this.className='s_btn s_btn_h'" onmouseout="this.className='s_btn'"></span></form><span class="tools"><span id="mHolder"><div id="mCon"><span>ÊäÈë·š</span></div></span></span><ul id="mMenu"><li><a href="#" name="ime_hw">ÊÖÐŽ</a></li><li><a href="#" name="ime_py">ÆŽÒô</a></li><li class="ln"></li><li><a href="#" name="ime_cl">¹Ø±Õ</a></li></ul></div>
<p id="lk"><a href="http://baike.baidu.com">°Ù¿Æ</a>¡¡<a href="http://wenku.baidu.com">ÎÄ¿â</a>¡¡<a href="http://www.hao123.com">hao123</a><span> | <a href="/more/">žü¶à&gt;&gt;</a></span></p><p id="lm"></p><p ><a id="seth" onClick="h(this)" href="http://utility.baidu.com/traf/click.php?id=215&url=http://www.baidu.com" onmousedown="return ns_c({'fm':'behs','tab':'homepage','pos':0})">°Ñ°Ù¶ÈÉèΪÖ÷Ò³</a><a id="setf" href="http://www.baidu.com/cache/sethelp/index.html" onmousedown="return ns_c({'fm':'behs','tab':'favorites','pos':0})" target="_blank">°Ñ°Ù¶ÈÉèΪÖ÷Ò³</a><span id="sekj"><a href="http://www.baidu.com/search/baidukuijie_mp.html" target="_blank" onmousedown="return ns_c({'fm':'behs','tab':'kuaijie','pos':1})">°Ñ°Ù¶ÈÌíŒÓµœ×ÀÃæ</a></span></p>
<p id="lh"><a href="http://e.baidu.com/?refer=888">ŒÓÈë°Ù¶ÈÍƹã</a> | <a href="http://top.baidu.com">ËÑË÷·çÔÆ°ñ</a> | <a href="http://home.baidu.com">¹ØÓÚ°Ù¶È</a> | <a href="http://ir.baidu.com">About Baidu</a></p><p id="cp">&copy;2012 Baidu <a href="/duty/">ʹÓðٶÈÇ°±Ø¶Á</a> <a href="http://www.miibeian.gov.cn" target="_blank">Ÿ©ICPÖ€030173ºÅ</a> <img src="http://www.baidu.com/cache/global/img/gs.gif"></p></div></body>

<script>var bds={se:{},comm : {ishome : 1,sid : "1324",user : "",username : "",sugHost : "http://suggestion.baidu.com/su",loginAction : []}}</script><script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/global/js/home-1.2.js"></script><script>var bdUser = null;var w=window,d=document,n=navigator,k=d.f.wd,a=d.getElementById("nv").getElementsByTagName("a"),isIE=n.userAgent.indexOf("MSIE")!=-1&&!window.opera;for(var i=0;i<a.length;i++){a[i].onclick=function(){if(k.value.length>0){var o=this,h=o.href,q=encodeURIComponent(k.value);if(h.indexOf("q=")!=-1){o.href=h.replace(/q=[^&\x24]*/,"q="+q)}else{this.href+="?q="+q}}}};(function(){if(/q=([^&]+)/.test(location.search)){k.value=decodeURIComponent(RegExp["\x241"])}})();if(n.cookieEnabled&&!/sug?=0/.test(d.cookie)){bds.se.sug();};function addEV(o, e, f){if(w.attachEvent){o.attachEvent("on" + e, f);}else if(w.addEventListener){ o.addEventListener(e, f, false);}}function G(id){return d.getElementById(id);}function ns_c(q){var p = encodeURIComponent(window.document.location.href), sQ = '', sV = '', mu='', img = window["BD_PS_C" + (new Date()).getTime()] = new Image();for (v in q) {sV = q[v];sQ += v + "=" + sV + "&";} mu= "&mu=" + p ;img.src = "http://nsclick.baidu.com/v.gif?pid=201&pj=www&rsv_sid=1324&" + sQ + "path="+p+"&t="+new Date().getTime();return true;}if(/\bbdime=[12]/.test(d.cookie)){document.write('<script src=http://s1.bdstatic.com/r/www/cache/ime/js/openime-1.0.0.js><\/script>');}(function(){var u = G("u").getElementsByTagName("a"), nv = G("nv").getElementsByTagName("a"), lk = G("lk").getElementsByTagName("a"), un = "";var tj_nv = ["news","tieba","zhidao","mp3","img","video","map"];var tj_lk = ["baike","wenku","hao123","more"];un = bds.comm.user == "" ? "" : bds.comm.user;function _addTJ(obj){addEV(obj, "mousedown", function(e){var e = e || window.event;var target = e.target || e.srcElement;ns_c({'fm':'behs','tab':target.name||'tj_user','un':encodeURIComponent(un)});});}for(var i = 0; i < u.length; i++){_addTJ(u[i]);}for(var i = 0; i < nv.length; i++){nv[i].name = 'tj_' + tj_nv[i];_addTJ(nv[i]);}for(var i = 0; i < lk.length; i++){lk[i].name = 'tj_' + tj_lk[i];_addTJ(lk[i]);}})();addEV(w,"load",function(){k.focus()});w.onunload=function(){};</script><script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/global/js/tangram-1.3.4c1.0.js"></script><script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/user/js/u-1.3.2.js"></script><script type="text/javascript" src="http://s1.bdstatic.com/r/www/cache/aoyun/js/aoyun-1.2.js"></script>



</html>



<!--f080b8037bcb957e-->
 

 

分享到:
评论

相关推荐

    linux 下ARP请求包发送程序

    在Linux中,通常使用`socket()`函数创建套接字,`bind()`函数绑定套接字到特定的网络接口,`sendto()`函数用于发送数据。 2. **原始套接字**:由于ARP请求不是TCP/IP协议栈的一部分,而是更底层的链路层协议,所以...

    模拟LINUX分区管理

    在本文中,我们将深入探讨如何模拟Linux分区管理,特别是针对动态分区管理方案,以及其中采用的最先适应分配算法。在Linux操作系统中,内存管理是一项核心任务,它涉及到如何有效地分配和回收内存,以确保系统资源的...

    QT模拟TCP/HTTP服务端的的Demo

    QT模拟TCP/HTTP服务端的Demo程序是一种使用QT框架创建的示例应用,它能够模拟TCP服务器和HTTP服务器的功能,以便于与客户端进行数据交换。QT是一个跨平台的C++库,提供了丰富的图形用户界面(GUI)工具和网络通信...

    基于Linux内核的键盘模拟实现

    【基于Linux内核的键盘模拟实现】涉及到的关键技术主要集中在Linux内核的中断处理、系统调用以及钩子函数上,这些都是实现键盘模拟的核心组成部分。 1. **中断处理**: 在Linux系统中,硬件中断被称为IRQ...

    在linux下模拟linux操作系统内存管理以及分配

    本文将深入探讨Linux下的内存管理机制,并通过C++代码示例来模拟这一过程。我们将重点关注以下几个方面:内存区域划分、内存分配策略、sbrk系统调用以及自定义内存分配器的实现。 1. **内存区域划分**: Linux内存...

    Linux运维工程师模拟面试题卷一

    ### Linux运维工程师模拟面试题知识点解析 #### 一、填空题知识点解析 1. **在Linux系统中,以(文件)方式访问设备。** - **知识点:** 在Linux中,所有硬件设备都被视为文件,通过特定路径下的文件来进行交互。...

    i.MX6ULL实现内存模拟硬盘,实现块设备驱动(制造请求)【Linux驱动】.zip

    本项目聚焦于在i.MX6ULL微处理器上实现一个内存模拟硬盘的块设备驱动,这个过程涉及到Linux内核的驱动模型、块设备驱动编程以及I/O调度等核心概念。 首先,我们需要理解i.MX6ULL芯片。i.MX6ULL是NXP半导体公司推出...

    基于Linux内核的键盘模拟实现.docx

    本文档详细介绍了基于 Linux 内核的键盘模拟实现,涵盖了 Linux 内核支持的外部调用接口、系统调用、中断、钩子函数等关键概念,并阐述了键盘工作机理和键盘模拟的实现方法。 一、Linux 内核支持的外部调用接口 ...

    Linux下的DHCP客户端,纯C代码

    DHCP协议基于UDP协议,客户端通过广播方式发送DHCP Discover请求,服务器回应DHCP Offer,客户端选择合适的服务器后发送DHCP Request,最后服务器发送DHCP Ack确认,完成IP地址的获取过程。 2. **C语言编程基础** ...

    i.MX6ULL实现内存模拟硬盘,实现块设备驱动(请求队列)【Linux驱动】.zip

    总之,i.MX6ULL上的内存模拟硬盘实现涉及了Linux内核驱动开发的关键技术,包括块设备驱动、请求队列、I/O调度以及设备操作函数的设计。熟练掌握这些技术,对于开发和调试嵌入式系统的存储驱动具有重要意义。

    linux_Socket_函数集(API索引)

    ### Linux Socket 函数集详解 在Linux环境下,Socket编程是实现网络通信的重要方式之一,它提供了应用程序间通过网络进行通信的能力。以下是对几个关键Socket函数的深入解析:`accept()`、`bind()`、`connect()`。 ...

    基于Linux内核的键盘模拟实现.pdf

    【基于Linux内核的键盘模拟实现】 在计算机操作系统领域,Linux因其开源、稳定和高度可定制的特性,已经成为许多系统开发的重要平台。特别是在嵌入式系统中,Linux内核可以根据需求进行裁剪和定制,满足各种不同的...

    Linux下EtherNet IP协议的实现

    根据客户端/服务器(C/S)模型,服务器端首先创建一个套接字并通过`bind()`函数绑定本地地址和端口,接着通过`listen()`函数监听客户端连接请求。客户端则通过`connect()`函数与服务器建立连接,之后双方可以通过`...

    基于Linux内核的键盘模拟实现.doc

    在Linux操作系统中,键盘模拟是通过与内核的交互来实现的,这涉及到对系统调用、中断处理程序以及钩子函数的理解。首先,我们来看看Linux内核如何处理硬件中断,特别是键盘这样的输入设备。 硬件中断是CPU对外部...

    发送ARP请求源码

    5. **发送和接收**:使用`sendto()`函数发送ARP请求,并通过`recvfrom()`函数接收响应。需要注意的是,接收方必须能够区分自身的ARP请求和来自其他设备的请求。 6. **解析响应**:接收到ARP响应后,源码需要解析并...

    22.Linux开发-采用线程处理网络请求.pdf

    3. **设置监听队列**:使用`listen()`函数设置最大连接请求队列长度,限制同时等待连接的客户端数量。 4. **等待客户端连接**:调用`accept()`函数等待并接受客户端的连接请求,返回一个新的套接字用于与客户端通信...

    C语言开发Linux下web服务器(支持GET/POST,SSL,目录显示等)

    在本项目中,我们将探讨如何使用C语言在Linux操作系统下开发一个功能丰富的Web服务器,它支持HTTP协议的GET和POST请求、SSL加密以及目录显示功能。这个任务涉及到多个IT领域的核心概念,包括网络编程、系统编程、...

    adc.rar_linux_linux AD驱动_linux ad _linux adc

    在实际应用中,Linux AD驱动的开发和测试是一个涉及硬件理解、内核接口熟悉和软件调试的复杂过程。开发者需要精通C语言,并且对Linux内核有深入的理解。在Linux 2.6.37.4这样的较旧内核版本上工作,可能还需要考虑向...

    linux下块设备代码

    4. 设置请求处理函数:`blk_set_request_fn()`用来指定处理I/O请求的函数。 5. 初始化硬件:如果驱动对应真实的硬件,这一步将配置硬件,如设置寄存器等。 6. 挂载设备:通过创建/dev下的设备文件,使得用户可以访问...

Global site tag (gtag.js) - Google Analytics