2012-08-01 21:50:36 iteye_19330 阅读数 110
  • 马哥Linux教程-Linux操作系统基础由浅入深全面讲解1

    本课程为全新马哥Linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    19349 人正在学习 去看看 马永亮

非常好的参考资料

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-->
 

 

2019-10-25 14:41:41 weixin_43919932 阅读数 96
  • 马哥Linux教程-Linux操作系统基础由浅入深全面讲解1

    本课程为全新马哥Linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    19349 人正在学习 去看看 马永亮

有关套接子和http请求报文的博客在CSDN有很多比如,点这里查看,这里我就不再做过多赘述了,下面我们直接实战,模拟http请求。

要求:浏览器访问本地的localhost,在浏览器页面打印出 Hello World

首先:ping 一下百度的网址得到一个百度的ip,我们可以利用这个ip来查看http应答报头

 39.156.69.79这是我们得到的百度的ip,事实上我下面用到的代码是另一个ip,其实都是一样的。代码呈上

这是我查资料的时候发现的一篇博客,觉得还不错就直接引用一下了查看原文

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(){
        int sockfd;
        int len;
        struct sockaddr_in address;
        int result;
        char *strings="GET / HTTP/1.1\r\nHost: 220.181.112.244\r\nConnection: Close\r\n\r\n";
        char ch;
        
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr("220.181.112.244");
        address.sin_port = htons(80);

        len = sizeof(address);
        result = connect(sockfd,  (struct sockaddr *)&address, len);
        if(result == -1){
                perror("oops: client1");
                return 1;
        }

        write(sockfd,strings,strlen(strings)); 
        
        while(read(sockfd,&ch, 1)){
                printf("%c", ch);
        }
        close(sockfd);
 
        return 0;
}

 通过上面这段代码我们可以得到百度的http应答格式,以便于我们模仿这种格式写出我们自己的服务端代码。浏览器返回的信息如下所示:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 14615
Content-Type: text/html
Date: Thu, 24 Oct 2019 18:06:08 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=0F88738275DFC145AFA84697D48B8087:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=0F88738275DFC145AFA84697D48B8087; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1571940368; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=0F88738275DFC1456A9A4114F710FF71:FG=1; max-age=31536000; expires=Fri, 23-Oct-20 18:06:08 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 1571940368268139802612049320315244439823
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Connection: close

<!DOCTYPE html><!--STATUS OK-->
<html>
<head>

   …… 这里省略一大堆内容 ……

</body></html>

以上我们可以得到:

  • HTTP/1.1 200 OK                                    //1.1表示http协议版本  200为状态码  OK为状态描述
  • Accept-Ranges: bytes                            //标识自身支持范围请求 更多
  • Cache-Control: no-cache                     //指定请求和响应遵循的缓存机制
  • Content-Length: 14615                         //要发送的内容长度
  • Connection: close                                  //短连接,表示服务器给客户端发送信息之后就断开了

其次:是服务器端的代码,这里我使用了多线程,以便实现多个客户端(页面)同时访问

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
//套接子通讯服务端,全双工

//多线程
void thread_fun(void* arg)
{
    	int c = (int)arg;
        
        //保存http应答头部信息
	char Http[2048] = "HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\n\
	Content-Length: 13\r\nConnection: close\r\n\\r\n";
        //客户端要接收的内容,与头部中的Content-Length对应
	char buff[128] = "hello world!";//发送的数据
  
	strcpy(Http, buff);
	char tmp[1024] = {0};//接受客户端请求
	int n = recv(c,tmp,1023,0);

	printf("%s\n",tmp);//打印客户端请求
	send(c,Http,strlen(Http),0);//向客户端应答

	close(c);//每个客户端只接收一次就关闭
	printf("client close\n");		
}




int main()
{
	int sockfd = socket(AF_INET, SOCK_STREAM, 0);//文件标识符
	assert( sockfd != -1);
	
	struct sockaddr_in saddr,caddr;//ipv4地址结构
	memset(&saddr, 0 , sizeof(saddr));
	saddr.sin_family = AF_INET;//地址族
	saddr.sin_port = htons(80);//大端,网络字节序列
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");//自己主机ip

	int res = bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));/*绑定监听的ip地址和端口*//*端口或ip错误会导致绑定失败*/
	assert( res != -1);

	listen(sockfd, 5);//创建监听队列,开始监听,不会阻塞

        //循环执行多次响应 注:如果不使用多线程或多进程的方式处理,只能同时响应一个客户端,其他客户端在监听队列排队,直到上一个客户端关闭,这里使用了多线程
	while(1)
	{
		int len = sizeof(caddr);
		int c = accept(sockfd, (struct sockaddr*)&caddr, &len);//c为监听套接子

		if( c < 0)
		{
			continue;//如果接收失败,重新接收
		}

		//printf("accept c = %d\n",c);//打印文件描述符,表示这是第几个客户端,其中0、1、2号不可用,为标准输入、输出、错误输出,3号为sockfd,因此客户端从4开始
		printf("accept(ip:%s,port:%d) c = %d\n",inet_ntoa(caddr.sin_addr),ntohs(caddr.sin_port),c);
		
                //多线程
		pthread_t id;
		pthread_create(&id,NULL,thread_fun,(void*)c);//这里没有传递c的地址,防止c多次使用时值被改变

	}

}

至此,服务端就完成了,由于我们使用了80号端口,所以运行时请用管理员权限。另外,服务端关闭后服务端的状态不会马上成为CLOSED状态,此时服务端处于TIME_WAIT状态,两分钟左右后才会完全关闭,服务端才能再次运行,具体原理请查资料TCP状态转移图 。用到的命令主要有以下几个:

编译: $gcc -o ser_http ser_http.c -pthread

运行:    $sudo ./ser_http

             $netstat -natp   此命令可查看使用TCP网络资源的进程

最后:我们根据服务端接受的来自网页的请求报文,还可以自己写一个客户端的代码

 步骤:运行服务端,浏览器输入 localhost 回车,在服务端上已经打印出了来自浏览器的请求报文,如下所示:

accept(ip:127.0.0.1,port:37022) c = 4
GET / HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: image/webp,*/*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive

以上我们可以得到:

  • GET / HTTP/1.1                              //用GET方式请求,http协议,版本1.1
  • Host: localhost                              //本地主机
  • User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0    //用户代理:操作系统、浏览器等的信息
  • Connection: keep-alive               //长链接

根据以上信息模拟客户端的http请求,代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
	int sockfd = socket(AF_INET,SOCK_STREAM, 0);
	assert( sockfd != -1);

	struct sockaddr_in saddr;
	memset(&saddr, 0 , sizeof(saddr));
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(80);
	saddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	int res = connect(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));
	assert( res != -1);

        //模拟http请求报头
	char str[1024] = "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: Close\r\n\r\n";
		
	send(sockfd, str, strlen(str), 0);//发送请求
	memset(str, 0, 1024);
	recv(sockfd,str,1023,0);//接受
	printf("%s\n",str);
	

	close(sockfd);

}

以上只实现了固定格式的http的应答方式,也就是说不管客户端发送的请求内容是什么,我们服务端都回复相同的信息,但真实的服务器是会根据请求内容的不同向客户端发送不同的内容,因此我们可以重新设计服务端实现动态的根据客户端的请求内容进行相应的响应应答。模拟web服务器http请求应答

 

2017-02-20 16:54:11 xiaoxuan2015 阅读数 2088
  • 马哥Linux教程-Linux操作系统基础由浅入深全面讲解1

    本课程为全新马哥Linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    19349 人正在学习 去看看 马永亮
linux下shell终端curl的post数据
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "http://post.html"  -d "2880[]=105&pid=2880&p=最佳&count=1&receipt=1&poll=投票" http://post.php
注释:
-A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
的意思就是申明客户端是windows2000下的ie6的浏览器;
-e "http://post.html"的意思就是refer是这个页面;
-d后面的参数都是将用post方式提交到服务器去的
最后面的就是将要post到的url地址
这里提到了-A、-e和-d参数,
其实用的比较多的还有
-x(后面用ip:port方式接代理服务器)等等,
这里就不一一列举了,可以参考man curl

demo
curl $URL -d "2880[]=105&pid=2880&p=最佳&count=1&receipt=1&poll=投票"

结果
Array
(
    [2880] => Array
        (
            [0] => 105
        )

    [pid] => 2880
    [p] => 最佳
    [count] => 1
    [receipt] => 1
    [poll] => 投票
)

4.模拟指定浏览器

有些变态的站点,限制了使用浏览器的类型.一样难不倒curl.

curl -A “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)” [URL]
这个就是一个模拟,win2k的ie5.0的一个访问.



3.认证

比如某些网站需要使用认证.可以使用如下命令.比如论坛什么的.

curl -u name:password www.secrets.com

4.模拟指定浏览器

有些变态的站点,限制了使用浏览器的类型.一样难不倒curl.

curl -A “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)” [URL]
这个就是一个模拟,win2k的ie5.0的一个访问.

5.Cookies

大部分网站都使用cookies,来记录浏览中的信息,识别用户等.自然使用curl也是可以做到的.
比如保存cookies.
curl -D head_cookies http://bbs.it580.com
这样将保存bbs.it580.com的cookies到运行命令的目录下,并命名为head_cookies.

保存了自然要下次使用的.如何使用呢?
curl -b head_cookies http://bbs.it580.com

6.使用代理

很多站点限制了访问的ip,或者说投票的时候发现只能一票一投。就要使用到这个了。
curl -x proxy.test.org:80 http://bbs.it580.com
这样就使用proxy.text.org代理,来访问http://bbs.it580.com了。

来自:http://blog.it580.com/curlhttp/
http://www.cnblogs.com/rootq/articles/1393933.html
2017-12-21 15:59:18 dreamstone_xiaoqw 阅读数 1813
  • 马哥Linux教程-Linux操作系统基础由浅入深全面讲解1

    本课程为全新马哥Linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    19349 人正在学习 去看看 马永亮

Windows平台参考代码

代码Copy自Linux下用c语言实现发送http请求

本文将代码抄录至此,附调试数据

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h> 
#define DEST_PORT 80
#define DEST_IP_ADDR "119.29.15.186"
#define DEST_IP_BY_NAME "www.yixzm.cn"
void process_info(int fd) {
    int send_num;
    char send_buf [] = "helloworld";
    char recv_buf [4096];
    char str1[4096];
    while (1) {
        printf("begin send\n");
        memset(str1,0,4096);
        strcat(str1, "POST http://www.yixzm.cn/tools/cppcgi.php?instr=xxcx HTTP/1.1\r\n");
        strcat(str1,"Host: www.yixzm.cn\r\n");
        strcat(str1,"Content-Length: 65\r\n");
        strcat(str1,"Content-Type: application/x-www-form-urlencoded\r\n");
        strcat(str1,"\r\n");
        strcat(str1,"mathod=adb_signe&token=0E1FEECD0EE54E3B8568A536A7036D78B1AC7EEE");
        strcat(str1,"\r\n\r\n");
        printf("str1 = %s\n",str1);
        send_num = send(fd, str1,strlen(str1),0);
        if (send_num < 0) {
            perror("send error");
            exit(1);
        } else {
            printf("send successful\n");
            printf("begin recv:\n");
            int recv_num = recv(fd,recv_buf,sizeof(recv_buf),0);
            if(recv_num < 0) {
                perror("recv");
                exit(1);
            } else {
                printf("recv sucess:%s\n",recv_buf);
            }
        }
        break;
        sleep(5);
    }
}


int main()
{
    int sock_fd;
    struct sockaddr_in addr_serv;
    sock_fd=socket(AF_INET, SOCK_STREAM, 0);
    if (sock_fd < 0)
    {
        perror("sock error");
        exit(1);
    }
    else
    {
        printf("sock successful");      
    }

    struct hostent* hostInfo = gethostbyname(DEST_IP_BY_NAME);
    if(NULL == hostInfo){
        printf("hostInfo is null\n");
        return -6;
    }

    memset(&addr_serv, 0, sizeof(addr_serv));
    addr_serv.sin_family = AF_INET;
    addr_serv.sin_port = htons(DEST_PORT);
    //addr_serv.sin_addr.s_addr = inet_addr(DEST_IP_ADDR);

     printf("Ip address = %s \n",inet_ntoa(*((struct in_addr*)hostInfo->h_addr)));
    memcpy(&addr_serv.sin_addr, &(*hostInfo->h_addr_list[0]), hostInfo->h_length);

    if (connect(sock_fd, (struct sockaddr*)(&addr_serv), sizeof(addr_serv)) < 0)
    {
        perror("connect error\n");
        exit(1);
    }
    else
    {
        printf("connect successful\n");
    }
    process_info(sock_fd);
}

服务端使用命令 ngrep port 80监听Apache 80端口的交互数据。
如果服务器没有ngrep,需要yum install ngrep

监听到的数据如下:

###########
T 180.168.174.128:49934 -> 10.135.42.160:80 [AP]
  POST http://www.yixzm.cn/tools/cppcgi.php?instr=xxcx HTTP/1.1..Host: www.yix
  zm.cn..Content-Length: 65..Content-Type: application/x-www-form-urlencoded..
  ..mathod=adb_signe&token=0E1FEECD0EE54E3B8568A536A7036D78B1AC7EEE....       
##
T 10.135.42.160:80 -> 180.168.174.128:49934 [AP]
  HTTP/1.1 200 OK..Date: Thu, 21 Dec 2017 07:37:15 GMT..Server: Apache/2.2.15 
  (CentOS)..X-Powered-By: PHP/5.3.3..Vary: Accept-Encoding..Content-Length: 83
  6..Connection: close..Content-Type: text/html; charset=UTF-8....<html>.<head
  >.        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'
   />.        <title> void * Future </title>..        <style type="text/css">.
          <!--.        @import url(style.css);.        -->.        </style>.</
  head>....<body>..<form name="formcmd" action="index.php?cmd">...<input type=
  "text" name="instr" id="cmd" />...<input type="button" name="button" value="
  ......" onclick="outputMan()" />..</form>..<iframe src="../../cgi-bin/bin/cp
  p.cgi?xxcx" id="iframe" name="iframe" frameborder="0" scrolling="no"></ifram
  e>..</body>.<footer>..&copy ............ ...ICP...17050606...-1&nbsp........
  ....31011502400367...</footer>..<script language="javascript">.function outp
  utMan(){..var cmd = formcmd.instr.value;..document.getElementById("iframe").
  src = "../../cgi-bin/bin/cpp.cgi?" + cmd; .}.</script>..</html>.            
########

其中,ccxc是从Client端传来的字段值。

2018-03-19 13:40:03 hyEnA_Tiger 阅读数 522
  • 马哥Linux教程-Linux操作系统基础由浅入深全面讲解1

    本课程为全新马哥Linux全套系列课程之一--Linux基础入门和架构了解,从Linux起源,Linux架构和Linux形成历史开始逐步讲解,让你彻彻底底了解Linux的诞生,之后介绍了Linux相关文化和核心组成结构,以及Linux常用命令和基本用法,课程由浅入深,讲授方法受到98%学员一致好评!

    19349 人正在学习 去看看 马永亮

在linux下创建启动脚本自动登录校园网



思想:原来实在浏览器上面输入用户名,密码,然后提交登录。其实浏览器只不过是一个代理,一个代理浏览网页的工具,或者说和服务器交流的工具。我们用curl模拟浏览器的校园网登录过程。    步骤如下。



1. 查找校园网接口


2. 分析请求头的请求参数


3.用curl 模拟浏览器的请求过程,如下

#!/usr/bin/env bash

curl -s -H "Host: 202.118.62.250
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://202.118.62.250/
Content-Type: application/x-www-form-urlencoded
Content-Length: 37
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
"   -d  "DDDDD=4031631878&upass=482219&0MKKey="  http://202.118.62.250 > /dev/null


4.写在.loginnet文件中 


5.将.loginnet文件写在.bashrc中,用source运算符引用


if [ -s ~/.loginnet -a -x ~/.loginnet ];then
        .  ~/.loginnet
fi

注意:不能这样写 source  "~/.loginnet"  我不知道为啥!!!! 

HTTP请求

阅读数 528

curl伪造ip请求

阅读数 2121

没有更多推荐了,返回首页