- 浏览: 18911 次
- 性别:
- 来自: 北京
最新评论
非常好的参考资料
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®Type=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">РÎÅ</a>¡¡<b>Íø Ò³</b>¡¡<a href="http://tieba.baidu.com">Ìù °É</a>¡¡<a href="http://zhidao.baidu.com">Öª µÀ</a>¡¡<a href="http://mp3.baidu.com">MP3</a>¡¡<a href="http://image.baidu.com">ÍŒ Ƭ</a>¡¡<a href="http://video.baidu.com">ÊÓ Æµ</a>¡¡<a href="http://map.baidu.com">µØ ÍŒ</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/">žü¶à>></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">©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线程同步--条件变量练习(2)
2012-08-07 18:00 840注意:消息是由主线程产生的,而消息这时候在堆中,两个线程通过 ... -
linux线程同步--条件变量练习(1)
2012-08-06 23:27 608注意:消息是由主线程产生的,而消息这时候在栈中,两个线程通过全 ... -
重复删除指针
2012-07-27 22:10 795#include <iostream> u ... -
继承关系中的早绑定
2012-07-27 09:00 581#include <iostream> u ... -
关于僵尸进程的练习。
2012-07-19 10:17 642请参考linux c一站式学习,此节内容 http://le ... -
has virtual functions but non-virtual destructor
2012-07-14 13:36 1044#include <iostream> u ... -
二叉树的中序遍历
2012-07-13 10:04 602#include <iostream> # ... -
两个有序数组求中位数的O(logn)算法
2012-07-13 00:16 1839#include <iostream> u ... -
智能指针的简易实现
2012-07-12 16:26 650#include <iostream> u ... -
C++中把多维数组传递给函数可使用模版的办法
2012-07-11 23:30 457#include <iostream> u ... -
图的广度深度遍历(邻接矩阵)
2012-07-11 23:25 1016#include <iostream> # ... -
堆排序代码实现
2012-07-01 23:37 517void heap_adjust(int a[],int ...
相关推荐
在Linux中,通常使用`socket()`函数创建套接字,`bind()`函数绑定套接字到特定的网络接口,`sendto()`函数用于发送数据。 2. **原始套接字**:由于ARP请求不是TCP/IP协议栈的一部分,而是更底层的链路层协议,所以...
在本文中,我们将深入探讨如何模拟Linux分区管理,特别是针对动态分区管理方案,以及其中采用的最先适应分配算法。在Linux操作系统中,内存管理是一项核心任务,它涉及到如何有效地分配和回收内存,以确保系统资源的...
QT模拟TCP/HTTP服务端的Demo程序是一种使用QT框架创建的示例应用,它能够模拟TCP服务器和HTTP服务器的功能,以便于与客户端进行数据交换。QT是一个跨平台的C++库,提供了丰富的图形用户界面(GUI)工具和网络通信...
【基于Linux内核的键盘模拟实现】涉及到的关键技术主要集中在Linux内核的中断处理、系统调用以及钩子函数上,这些都是实现键盘模拟的核心组成部分。 1. **中断处理**: 在Linux系统中,硬件中断被称为IRQ...
本文将深入探讨Linux下的内存管理机制,并通过C++代码示例来模拟这一过程。我们将重点关注以下几个方面:内存区域划分、内存分配策略、sbrk系统调用以及自定义内存分配器的实现。 1. **内存区域划分**: Linux内存...
### Linux运维工程师模拟面试题知识点解析 #### 一、填空题知识点解析 1. **在Linux系统中,以(文件)方式访问设备。** - **知识点:** 在Linux中,所有硬件设备都被视为文件,通过特定路径下的文件来进行交互。...
本项目聚焦于在i.MX6ULL微处理器上实现一个内存模拟硬盘的块设备驱动,这个过程涉及到Linux内核的驱动模型、块设备驱动编程以及I/O调度等核心概念。 首先,我们需要理解i.MX6ULL芯片。i.MX6ULL是NXP半导体公司推出...
本文档详细介绍了基于 Linux 内核的键盘模拟实现,涵盖了 Linux 内核支持的外部调用接口、系统调用、中断、钩子函数等关键概念,并阐述了键盘工作机理和键盘模拟的实现方法。 一、Linux 内核支持的外部调用接口 ...
DHCP协议基于UDP协议,客户端通过广播方式发送DHCP Discover请求,服务器回应DHCP Offer,客户端选择合适的服务器后发送DHCP Request,最后服务器发送DHCP Ack确认,完成IP地址的获取过程。 2. **C语言编程基础** ...
总之,i.MX6ULL上的内存模拟硬盘实现涉及了Linux内核驱动开发的关键技术,包括块设备驱动、请求队列、I/O调度以及设备操作函数的设计。熟练掌握这些技术,对于开发和调试嵌入式系统的存储驱动具有重要意义。
### Linux Socket 函数集详解 在Linux环境下,Socket编程是实现网络通信的重要方式之一,它提供了应用程序间通过网络进行通信的能力。以下是对几个关键Socket函数的深入解析:`accept()`、`bind()`、`connect()`。 ...
【基于Linux内核的键盘模拟实现】 在计算机操作系统领域,Linux因其开源、稳定和高度可定制的特性,已经成为许多系统开发的重要平台。特别是在嵌入式系统中,Linux内核可以根据需求进行裁剪和定制,满足各种不同的...
根据客户端/服务器(C/S)模型,服务器端首先创建一个套接字并通过`bind()`函数绑定本地地址和端口,接着通过`listen()`函数监听客户端连接请求。客户端则通过`connect()`函数与服务器建立连接,之后双方可以通过`...
在Linux操作系统中,键盘模拟是通过与内核的交互来实现的,这涉及到对系统调用、中断处理程序以及钩子函数的理解。首先,我们来看看Linux内核如何处理硬件中断,特别是键盘这样的输入设备。 硬件中断是CPU对外部...
5. **发送和接收**:使用`sendto()`函数发送ARP请求,并通过`recvfrom()`函数接收响应。需要注意的是,接收方必须能够区分自身的ARP请求和来自其他设备的请求。 6. **解析响应**:接收到ARP响应后,源码需要解析并...
3. **设置监听队列**:使用`listen()`函数设置最大连接请求队列长度,限制同时等待连接的客户端数量。 4. **等待客户端连接**:调用`accept()`函数等待并接受客户端的连接请求,返回一个新的套接字用于与客户端通信...
在本项目中,我们将探讨如何使用C语言在Linux操作系统下开发一个功能丰富的Web服务器,它支持HTTP协议的GET和POST请求、SSL加密以及目录显示功能。这个任务涉及到多个IT领域的核心概念,包括网络编程、系统编程、...
在实际应用中,Linux AD驱动的开发和测试是一个涉及硬件理解、内核接口熟悉和软件调试的复杂过程。开发者需要精通C语言,并且对Linux内核有深入的理解。在Linux 2.6.37.4这样的较旧内核版本上工作,可能还需要考虑向...
4. 设置请求处理函数:`blk_set_request_fn()`用来指定处理I/O请求的函数。 5. 初始化硬件:如果驱动对应真实的硬件,这一步将配置硬件,如设置寄存器等。 6. 挂载设备:通过创建/dev下的设备文件,使得用户可以访问...