扫号的api跟知道http代理微店和微信有关系吗吗

国内最快最多的专业HTTP、SOCKS代理、QQ代理提供商!
我们有专业的机房!专业的百兆服务器!保证全网IP最多!最快,提供多种丰富的API接口!自由选择提取信息!(严禁用代理从事触犯国家法律法规的行为!!!)我们提供的所有IP都为固定独享IP,可以长期使用,不是扫号所得!
固定ip数量
赠送小时数
固定ip数量
赠送小时数
固定ip数量
赠送小时数
固定ip数量
赠送小时数
我们有专业的机房!专业的百兆服务器!保证全网IP最多!最快
丰富的API接口
百兆四线服务器
我们提供多种丰富的API接口!自由选择提取信息!
众享ip代理网提固定、独立、稳定、独享的IP代理服务。所有IP都是自己的所购服务器分配。不是网上那些扫号多得到,可以为客户提供稳定高效的IP代理服务!2508人阅读
如何利用socket进行HTTP访问
c语言实现http 请求头发送主要步骤:
1。建立到服务器的TCP连接
2。向服务器发送GET或者POST,格式请参考HTTP协议
3。接收服务器返回的
http://blog.csdn.net/wbczyh/article/details/2117094
平常我们要访问某个URL一般都是通过浏览器进行:提交一个URL请求后,浏览器将请求发向目标服务器或者代理服务器,目标服务器或者代理服务器返回我们所需要的数据,浏览器接收到这些数据后保存成文件并进行显示。
下面我们看看如何自己利用winsock2.h中的接口来实现这个功能?为了简化问题,作以下假设:
通过代理服务器进行HTTP访问,这样就省去了对URL进行DNS解析的步骤,假设代理服务器的地址为:192.168.0.1:808。
这个功能由以下几个部分组成:
1.&如何建立连接?
2.&如何发送请求?
3.&如何接收数据?
4.&如何判断数据接收完成?
下面我们依次来看下这些问题如何解决?
一、如何建立与服务器之间的连接
HTTP基本TCP,所以我们需要与服务器建立连接,然后才能发送数据。
建立连接参考如下函数socket_open:
*打开Socket,返回socketId,-1表示失败
int&socket_open(int&IP,int&Port,int&type){
SOCKET socketId;
&struct&sockaddr_in serv_
&socketId=socket(AF_INET,SOCK_STREAM,0);
&if((int)socketId&0)
&&&&&& printf(&[ERROR]Create a socket failed!/n&);
&&&&&&&return&-1;
&memset(&serv_addr,0,sizeof(serv_addr));
&serv_addr.sin_family=AF_INET;
&serv_addr.sin_addr.s_addr = ntohl(IP);
&serv_addr.sin_port = htons((USHORT)Port);
&status=connect(socketId,(struct&sockaddr*)&serv_addr,sizeof(serv_addr));
&&&&if(status!=0)
&&& printf(&[ERROR]Connecting failed!/n&);
&&& closesocket(socketId);
&&&&return&-1;
&return&socketId;
&&&&&& &调用方式如下:
&socketId=socket_open(0xC0A);&//0xC0A80001是192.168.0.1的十六进制写法。
二、如何发送请求
发送数据要根据HTTP协议的要求附加协议头:
static&const&char* protocolHead=&GET /index.html HTTP/1.1/n&
&&&&&&Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*/n&
&&&&&&Accept-Language: zh-cn/n&
&&&&&&User-Agent:iPanelBrowser/2.0/n&
&&&&&&Host: :80/n&
&&&&&&Connection: close/n/n&
&&&&&这里使用GET来获取指定URL的指定文档。
&&&&&建立连接后使用send将这些数据发送出去:
&&&& send(socketId, protocolHead,strlen(protocolHead),0);
&&&&&发送完成HTTP请求后就等待接收数据。
三、如何接收数据
这里采用select循环查询的方式来判断有无数据到来:
struct&timeval tm = {0,7};
&&&& fd_set fds_r;
&&&& char recvBuf[4096]={‘/0’};
&&&& FD_ZERO(&fds_r);
&&&& FD_SET(socketId,&fds_r);
status=select(socketId+ 1, &fds_r, 0, 0, &tm);&//socketId在这里是最大的fd
&&&&&if(status & 0 && FD_ISSET(socketId, &fds_r))
&&&&&&&& printf(&Socket is readable...fd=[%d]/n&,socketId);
&&&& &&&& recv(socketId,recvBuf,4096,0);
这样数据包就保存到缓冲区中了。
四、如何判断数据接收完成
首先对返回数据的状态进行判断,仅当状态为“&HTTP 200 OK&”时才表明正确返回,这时才对数据进行解析并保存,如果状态为HTTP 404 NOT FOUND或者其它状态则表明没有找到资源或者出现其它问题,可参考。
当数据正确返回时,为了将实际数据从协议中分离出来进行保存,需要对HTTP数据包进行解析得到Content-Length,然后在包含Content-Length的当前数据包或者随后的数据包中查找第一个空行,这就是内容(Content)的开始位置,再配合前面解析得到的Content-Length,就能够知道什么时候数据接收完成了。换行符为“/r/n”,也兼容“/n”或者“/r”,设换行符为^P,则空行如果位于内容中间或结尾则可查找“^P^P”,若位于开头,则查找^P。
基本就是上面这些,这四个问题解决了,那么整个问题也就解决了!
当然也可以把上面的3、4步放一起。
http://blog.csdn.net/gideal_wang/article/details/4316691
一 原理区别
&&& 一般在浏览器中输入网址访问资源都是通过GET方式;在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE
URL全称是资源描述符,我们可以这样认 为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查&,改&,增&,删&4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询&资源信息,而POST一般用于更新&资源信息(个人认为这是GET和POST的本质区别,也是协议设计者的本意,其它区别都是具体表现形式的差异&)。
  根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的&。
  1.所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
  * 注意:这里安全的含义仅仅是指是非修改信息。
  2.幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等&这个概念:
  幂等&(idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。
  幂等有以下几种定义:
  对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a)&=abs(abs(a))&。
  对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x)&&=&&x&。
看完上述解释后,应该可以理解GET幂等的含义了。
  但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操 作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。
  根据HTTP规范,POST表示可能修改变服务器上的资源的请求&。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。
  上面大概说了一下HTTP规范中,GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多,比如说:
  1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。
  2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。
  3.另外一个是,早期的但是Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计&。还有一个较为严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。
&  * 简单解释一下MVC:MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
  以上3点典型地描述了老一套的风格(没有严格遵守HTTP规范),随着架构的发展,现在出现REST(Representational State Transfer),一套支持HTTP规范的新风格,这里不多说了,可以参考《RESTful Web Services》。
二 表现形式区别
&& 搞清了两者的原理区别,我们再来看一下他们实际应用中的区别:
&&& 为了理解两者在传输过程中的不同,我们先看一下HTTP协议的格式:
&&& HTTP请求:
&request line&
&blank line&
&request-body&]
在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
GET与POST方法实例:
GET&/books/?sex=man&name=Professional&HTTP/1.1
User-Agent: Mozilla/5.0 (W U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/ Firefox/1.0.1
Connection: Keep-Alive
POST / HTTP/1.1
User-Agent: Mozilla/5.0 (W U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/ Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
&&&& (----此处空一行----)
name=Professional%20Ajax&publisher=Wiley
有了以上对HTTP请求的了解和示例,我们再来看两种提交方式的区别:
&& (1)GET提交,请求的数据会附在URL之后(就是把数据放置在请求行(request line)中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,所有非ASCII字符均需要编码再传输,关于Url编码可参考:。
  POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中红色字体标明的就是实际的传输数据
&&&& 因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变
& & (2)传输数据的大小:首先声明:HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。
而在实际开发中存在的限制主要有:
GET:特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
因此对于GET提交时,传输数据就会受到URL长度的限制。
POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。
&(3)安全性:
.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这 里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击
(4)Http get,post,soap协议都是在http上运行的
1)get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的
&&&&&&& 查询字符串的长度受到web浏览器和web服务器的限制(如IE最多支持2048个字符),不适合传输大型数据集同时,它很不安全
2)post:请求参数是在http标题的一个不同部分(名为entity body)传输的,这一部分用来传输表单信息,因此必须将Content-type设置为:application/x-www-form-urlencoded。post设计用来支持web窗体上的用户字段,其参数也是作为key/value对传输。
&&&&& 但是:它不支持复杂数据类型,因为post没有定义传输数据结构的语义和规则。
3)soap:是http post的一个专用版本,遵循一种特殊的xml消息格式
&&&&&& Content-type设置为: text/xml&& 任何数据都可以xml化
三 HTTP响应&
1.HTTP响应格式:
&status line&
&blank line&
[&response-body&]
在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。&
&HTTP响应实例:
HTTP/1.1 200 OK
Date: Sat, 31 Dec :59 GMT
Content-Type: text/charset=ISO-8859-1
Content-Length: 122
<title>Wrox Homepage</title>
<!-- body goes here -->
2.最常用的状态码有:
◆200 (OK): 找到了该资源,并且一切正常。
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。
四 完整示例:
GET /DEMOWebServices2.8/Service.asmx/CancelOrder?UserID=string&PWD=string&OrderConfirmation=string HTTP/1.1
HTTP/1.1 200 OK
Content-Type: text/ charset=utf-8
Content-Length: length
&?xml version=&1.0& encoding=&utf-8&?&
&objPlaceOrderResponse xmlns=&/webservices2.3&&
&Success&boolean&/Success&
&ErrorDescription&string&/ErrorDescription&
&ErrorNumber&int&/ErrorNumber&
&CustomerOrderReference&long&/CustomerOrderReference&
&OrderConfirmation&string&/OrderConfirmation&
&CustomerDealRef&string&/CustomerDealRef&
&/objPlaceOrderResponse&
HTTP POST&
POST /DEMOWebServices2.8/Service.asmx/CancelOrder HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: length
UserID=string&PWD=string&OrderConfirmation=string
HTTP/1.1 200 OK
Content-Type: text/ charset=utf-8
Content-Length: length
&?xml version=&1.0& encoding=&utf-8&?&
&objPlaceOrderResponse xmlns=&/webservices2.3&&
&Success&boolean&/Success&
&ErrorDescription&string&/ErrorDescription&
&ErrorNumber&int&/ErrorNumber&
&CustomerOrderReference&long&/CustomerOrderReference&
&OrderConfirmation&string&/OrderConfirmation&
&CustomerDealRef&string&/CustomerDealRef&
&/objPlaceOrderResponse&
POST /DEMOWebServices2.8/Service.asmx HTTP/1.1
Content-Type: application/soap+ charset=utf-8
Content-Length: length
&?xml version=&1.0& encoding=&utf-8&?&
&soap12:Envelope xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:xsd=&http://www.w3.org/2001/XMLSchema& xmlns:soap12=&http://www.w3.org/2003/05/soap-envelope&&
&soap12:Body&
&&& &CancelOrder xmlns=&/webservices2.3&&
&&&&& &UserID&string&/UserID&
&&&&& &PWD&string&/PWD&
&&&&& &OrderConfirmation&string&/OrderConfirmation&
&&& &/CancelOrder&
&/soap12:Body&
&/soap12:Envelope&
HTTP/1.1 200 OK
Content-Type: application/soap+ charset=utf-8
Content-Length: length
&?xml version=&1.0& encoding=&utf-8&?&
&soap12:Envelope xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance& xmlns:xsd=&http://www.w3.org/2001/XMLSchema& xmlns:soap12=&http://www.w3.org/2003/05/soap-envelope&&
&soap12:Body&
&&& &CancelOrderResponse xmlns=&/webservices2.3&&
&&&&& &CancelOrderResult&
&&&&&&& &Success&boolean&/Success&
&&&&&&& &ErrorDescription&string&/ErrorDescription&
&&&&&&& &ErrorNumber&int&/ErrorNumber&
&&&&&&& &CustomerOrderReference&long&/CustomerOrderReference&
&&&&&&& &OrderConfirmation&string&/OrderConfirmation&
&&&&&&& &CustomerDealRef&string&/CustomerDealRef&
&&&&& &/CancelOrderResult&
&&& &/CancelOrderResponse&
&/soap12:Body&
&/soap12:Envelope&
/cslunatic/item/d319b12d1e0df1bbb632633e
《-》Linux下用c语言实现发送http请求&方式可以Get或者Post&,下面是一个POST实例。
#include&&stdio.h&&
#include&&sys/socket.h&&
#include&&sys/types.h&&
#include&&time.h&&
#include&&errno.h&&
#include&&signal.h&&
#include&&stdlib.h&&
#include&&string.h&&
#include&&unistd.h&&
#include&&sys/wait.h&&
#include&&sys/time.h&&
#include&&netinet/in.h&&
#include&&arpa/inet.h&&
#define&IPSTR&&61.147.124.120&&
#define&PORT&80&
#define&BUFSIZE&1024&
int&main(intargc,&char**argv)&
&&&&&&&&intsockfd,&ret,&i,&h;&
&&&&&&&structsockaddr_in&&
&&&&&&&charstr1[4096],&str2[4096],&buf[BUFSIZE],&*&
&&&&&&&socklen_t&&
&&&&&&&fd_set&&&t_set1;&
&&&&&&&structtimeval&&&
&&&&&&&if((sockfd&=&socket(AF_INET,&SOCK_STREAM,&0))&&&0&)&{&
&&&&&&&&&&&&&&&&printf(&创建网络连接失败,本线程即将终止---socket&error!\n&);&
&&&&&&&&&&&&&&&exit(0);&
&&&&&&&};&
&&&&&&&bzero(&servaddr,&sizeof(servaddr));&
&&&&&&&servaddr.sin_family&=&AF_INET;&
&&&&&&&servaddr.sin_port&=&htons(PORT);&
&&&&&&&if(inet_pton(AF_INET,&IPSTR,&&servaddr.sin_addr)&&=&0&){&
&&&&&&&&&&&&&&&&printf(&创建网络连接失败,本线程即将终止--inet_pton&error!\n&);&
&&&&&&&&&&&&&&&exit(0);&
&&&&&&&};&
&&&&&&&&if(connect(sockfd,&(structsockaddr&*)&servaddr,&sizeof(servaddr))&&&0){&
&&&&&&&&&&&&&&&&printf(&连接到服务器失败,connect&error!\n&);&
&&&&&&&&&&&&&&&exit(0);&
&&&&&&&&printf(&与远端建立了连接\n&);&
&&&&&&&//发送数据&
&&&&&&&memset(str2,&0,&4096);&
&&&&&&&strcat(str2,&&qqCode=&);&
&&&&&&&str=(char*)malloc(128);&
&&&&&&&len&=&strlen(str2);&
&&&&&&&sprintf(str,&&%d&,&len);&
&&&&&&&memset(str1,&0,&4096);&
&&&&&&&strcat(str1,&&POST&/webservices/qqOnlineWebService.asmx/qqCheckOnline&HTTP/1.1\n&);&
&&&&&&&strcat(str1,&&Host:&.cn\n&);&
&&&&&&&strcat(str1,&&Content-Type:&application/x-www-form-urlencoded\n&);&
&&&&&&&strcat(str1,&&Content-Length:&&);&
&&&&&&&strcat(str1,&str);&
&&&&&&&strcat(str1,&&\n\n&);&
&&&&&&&strcat(str1,&str2);&
&&&&&&&strcat(str1,&&\r\n\r\n&);&
&&&&&&&printf(&%s\n&,str1);&
&&&&&&&ret&=&write(sockfd,str1,strlen(str1));&
&&&&&&&if(ret&&&0)&{&
&&&&&&&&&&&&&&&printf(&发送失败!错误代码是%d,错误信息是'%s'\n&,errno,&strerror(errno));&
&&&&&&&&&&&&&&&exit(0);&
&&&&&&&}else{&
&&&&&&&&&&&&&&&printf(&消息发送成功,共发送了%d个字节!\n\n&,&ret);&
&&&&&&&FD_ZERO(&t_set1);&
&&&&&&&FD_SET(sockfd,&&t_set1);&
&&&&&&&while(1)
&&&&&&&&&&&&&&&sleep(2);&
&&&&&&&&&&&&&&&tv.tv_sec=&0;&
&&&&&&&&&&&&&&&tv.tv_usec=&0;&
&&&&&&&&&&&&&&&h=&0;&
&&&&&&&&&&&&&&&printf(&---------------&1&);&
&&&&&&&&&&&&&&&h=&select(sockfd&+1,&&t_set1,&NULL,&NULL,&&tv);&
&&&&&&&&&&&&&&&printf(&---------------&2&);&
&&&&&&&&&&&&&&&//if&(h&==&0)&&
&&&&&&&&&&&&&&&if(h&&&0)&{&
&&&&&&&&&&&&&&&&&&&&&&&close(sockfd);&
&&&&&&&&&&&&&&&&&&&&&&&printf(&在读取数据报文时SELECT检测到异常,该异常导致线程终止!\n&);&
&&&&&&&&&&&&&&&&&&&&&&&return-1;&
&&&&&&&&&&&&&&&};&
&&&&&&&&&&&&&&&if(h&&&0){&
&&&&&&&&&&&&&&&&&&&&&&&memset(buf,&0,&4096);&
&&&&&&&&&&&&&&&&&&&&&&&i=&read(sockfd,&buf,&4095);&
&&&&&&&&&&&&&&&&&&&&&&&if(i==0){&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&close(sockfd);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&printf(&读取数据报文时发现远端关闭,该线程终止!\n&);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return-1;&
&&&&&&&&&&&&&&&&&&&&&&}&
&&&&&&&&&&&&&&&&&&&&&&&printf(&%s\n&,&buf);&
&&&&&&&&&&&&&&&}&
&&&&&&&close(sockfd);&
&&&&&&&return0;&
《二》短信告警功能测试程序:(已经成功发送短信转发,与浏览器运行同效:/smsComputer/smsComputersend.asp?zh=&mm=&hm=&nr=tanqiuwei5445abc123&dxlbid=72)
#include & &stdio.h&&
#include & &stdlib.h&&
#include & &string.h&&
#include & &stdarg.h&&
#include & &sys/socket.h&&
#include & &netinet/in.h&&
#include & &netdb.h&
int htconnect(char & *host, & int & port)
& & int white_&
& & struct hostent & * &&
& & struct sockaddr_in &&
& & site = gethostbyname(host);&
& & if(site==NULL)
return & -2;&
& & white_sock = socket(AF_INET,SOCK_STREAM,0);&
& & if(white_sock & &0) &
& & printf(&创建网络连接失败,本线程即将终止---socket error!\n&);&
return & -1;&
& & memset(&me, 0, sizeof(struct sockaddr_in));&
& & memcpy(&me.sin_addr, site-&h_addr_list[0], site-&h_length);&
& & me.sin_family = AF_INET;&
& & me.sin_port = htons(port);&
& & return(connect(white_sock, (struct sockaddr*)&me,sizeof(struct sockaddr))&0)? -1:white_&
int htsend(int sock, char *fmt, ...)
& & char & BUF[1024];&
& & va_list &&
& & va_start(argptr,fmt);&
& & vsprintf(BUF,fmt,argptr);&
& & va_end(argptr);&
& & printf(BUF);&
& & return & send(sock,BUF,strlen(BUF),0);&
int main(int argc,char **argv)
int black_
char &msg[4096]={0};
char &request[4096] = {0};
black_sock = htconnect(&&,80);
if(black_sock &1)
printf(&连接到服务器失败,connect error!\n&);
return (-1);
char *URL = &/smsComputer/smsComputersend.asp&;
char *Content = &zh=&mm=&hm=&nr=tanqiuwei5445abc123&dxlbid=72 HTTP/1.1&;
char *Accept = &application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/x-ms-xbap, application/x-ms-application,
char *Accept_language = &zh-cn&;
char *User_Agent = &Mozilla/4.0 ( MSIE 8.0; Windows NT 5.1; Trident/4.0; InfoPath.2; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E)&;
char *Accept_Encoding = &gzip, deflate&;
char *Host = &&;
char *Connection = &Keep-Alive&;
//注意,HTTP消息后面结尾一定要用“\r\n\r\n”,不然就会返回“HTTP/1.1 400 Bad Request”
sprintf(request, &GET %s?%s\r\nAccept: %s\r\nAccept-Language: %s\r\nUser-Agent: %s\r\nAccept-Encoding: %s\r\nHost: %s\r\nConnection: %s\r\n\r\n&,
URL,Content, Accept, Accept_language,User_Agent,Accept_Encoding,Host,Connection); &
printf(&%s&,request);
printf(&\n&);
send(black_sock, request,sizeof(request),0);
recv(black_sock,msg,sizeof(msg),0);
{ & & & & & & &
printf(&/n%s&,msg);
printf(&configure &success/n&);
close(black_sock);
& & & & & &&
& return (-1);&
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:229243次
积分:2770
积分:2770
排名:第6794名
原创:34篇
转载:180篇
评论:19条
(1)(2)(2)(2)(3)(2)(3)(9)(10)(4)(16)(1)(7)(25)(4)(2)(2)(2)(1)(2)(2)(6)(1)(2)(2)(36)(6)(2)(28)(9)(16)(7)  接上篇,这次继续将程序完善,为其添加自动设置和取消代理的功能 ,主要用到一个API:InternetSetOption。从名字就知道他是干什么的了:设置互联网选项用的,HTTP代理属于互联网的范围,自然设置代理选项就要用到他了。
HTTP代理实现请求报文的拦截与篡改8--自动设置及取消代理+源码下载
我们来看一下他的定义
BOOL InternetSetOption(
HINTERNET hInternet,
DWORD dwOption,
LPVOID lpBuffer,
DWORD dwBufferLength
Parameters
hInternet [in]
Handle on which to set information.
想设置信息的那个句柄
dwOption [in]
Internet option to be set. This can be one of the Option Flags values.
要设置的网络选项,可以是一个或者多个Option Flags 的值
lpBuffer [in]
Pointer to a buffer that contains the option setting.
包含选项设置的缓存的指针。
dwBufferLength [in]
Size of the lpBuffer buffer. If lpBuffer contains a string, the size is in TCHARs. If lpBuffer contains anything other than a string, the size is in bytes.
lpBuffer缓存的大小, 如果lpBuffer包含一个字符串,这个大小就是字符串的大小,假如lpBuffer除了字符串还包括一些其它东西,这个大小就是byte 的大小
Return value
Returns TRUE if successful, or FALSE otherwise. To get a specific error message, call GetLastError.
如果成功了返回TRUE,否则FALSE。如果想得到是什么错误,调用 GetLastError 。
  官方套话:本人翻译水平有限,其中错误在所难免,敬请原谅,此话后面照样适用,不再重复说明, OVER&
  从这些参数的定义可知,第一个参数是要设置信息的程序句柄,第二个是要设置的网络选项的类型(Option flags),可以是一个也可以多个。
  下面我们再来看看Option Flags有哪些:&&&
  这个网址列出了所有的Option flags的网址,N多,对我们有用的,就两个。其它的自己去看&&
  一.INTERNET_OPTION_PER_CONNECTION_OPTION&&& 75 &
Sets or retrieves an INTERNET_PER_CONN_OPTION_LIST structure that specifies a list of options for a particular connection. This is used by InternetQueryOption and InternetSetOption. This option is only valid in Internet Explorer 5 and later.
为一个特定的连接设置或者恢复一个INTERNET_PER_CONN_OPTION_LIST 的列表结构。一般被使用于InternetQueryOption 和 InternetSetOption 两个API。IE5.0及以上才支持这个选项。
INTERNET_OPTION_PER_CONNECTION_OPTION causes the settings to be changed on a system-wide basis when a NULLhandle is used in the call to InternetSetOption. To refresh the global proxy settings, you must call InternetSetOption with theINTERNET_OPTION_REFRESH option flag.
注 : 当 调用InternetSetOption.时,如果第二个参数设置成了此值,而第一个参数为NULL时,所引起的变更将是全局性的也就是系统级别的。刷新全局代理设置,你必须调用InternetSetOption,并使用INTERNET_OPTION_REFRESH
To change proxy information for the entire process without affecting the global settings in Internet Explorer 5 and later, use this option on the handle that is returned from InternetOpen. The following code example changes the proxy for the whole process even though the HINTERNET handle is closed and is not used by any requests.
注 : 如果想在IE5.0及以上浏览器上改变代理设置但又不想影响全局,那么设置句柄为InternetOpen返回的值......
后面的不翻了.......
For more information and code examples, see KB article 226473
  从上面我们知道了。
InternetSetOption(
  NULL,
  INTERNET_OPTION_PER_CONNECTION_OPTION,
  连接选项(一个INTERNET_PER_CONN_OPTION_LIST类型的列表结构),
  第三个参数的大小
  执行上面的API后,我们就可以根据第三个参数里的选项(一个或者多个)来变更互联网的设置了,而且这些变更是全局性的, 因为第一个参数是NULL,如果第一个参数换成 InternetOpen API返回的句柄的话, 那么第三个参数里的选项, 就是仅针对IE5.0及以上的浏览器了 。。&
  看到这里,其实大家应该已经很清楚了,& 结构 是一个关键,因为这个结构就是用来存放要变更的选项的内容的。下面我们再来看看这个结构的定义&&&& 。&
typedef struct {
LPINTERNET_PER_CONN_OPTION pO
} INTERNET_PER_CONN_OPTION_LIST, *LPINTERNET_PER_CONN_OPTION_LIST;
Size of the structure, in bytes.
结构的大小
pszConnection
Pointer to a string that contains the name of the RAS connection or NULL, which indicates the default or LAN connection, to set or query options on.
一个NULL值或者一个字符串指针,这个字符串就是你要设置或者查询选项的那个默认的或者局域网的RAS连接的名字。(我日,这翻译的还真拗口和难懂,看来汉语中也要引入从句这种语法规则 ) 算了,还是直译吧,指向一个NULL或者字符串指针 , 哪个字符串呢?就是RAS连接的名字,那又是个哪个RAS连接呢?默认的或者局域网的连接,再补充一下,就是你要设置或者查询选项的那个
dwOptionCount
Number of options to query or set.
要查询或者设置的选项的个数
dwOptionError
Options that failed, if an error occurs.
选项那个失败的,假如一个错误发生(逐词直译)
Pointer to an array of INTERNET_PER_CONN_OPTION structures containing the options to query or set.
一个包含查询或设置选项的INTERNET_PER_CONN_OPTION结构的数组的指针
  还是来看一个例子吧 。例子的力量是伟大的。
INTERNET_PER_CONN_OPTION_LIST
INTERNET_PER_CONN_OPTION options[5];
// 有几个选项需要设置这里就分配几个
list.pszConnection = NULL;
// 为NULL,表示默认的连接
list.dwOptionCount = 5 ;
options的个数
list.dwOptionError = 0 ;
list.pOptions =
// 指向options,就是选项的数组
  这里又出来一个新结构 , 再来看一看其定义&
typedef struct {
FILETIME ftV
} INTERNET_PER_CONN_OPTION, *LPINTERNET_PER_CONN_OPTION;
只有2个成员,一个DWORD类型的dwOption,另外一个union类型的 看看其说明
Members 成员
Option to be queried or set. This member can be one of the following values.
被查询或者设置的选项,这个成员可以下面的值当中的一个。
下面很多值,这里就不列出来了。后面说明的时候会对用到的进行说明
Union that contains the value for the option. It can be any one of the following types depending on the value of dwOption:
选项的值,可以下面所列类型中的一个,至于是那个,这个要依赖你的dwOption的值
Unsigned long integer value.
无符号长整型
Pointer to a string value.
指向一个字符串的指针
A FILETIME structure.
一个FILETIME结构
  根据上面的描述,第一个成员是要设置的选项的类型,第二个是要设置的选项的值,至于这个值是什么类型,要依据第一个选项的类型的来决定。继续例子&
INTERNET_PER_CONN_OPTION options[5] ;
options[0].dwOption = INTERNET_PER_CONN_FLAGS ;
options[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
options[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER ;
options[1].Value.pszValue = _T("http=127.0.0.1:8888;");
options[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS ;
options[2].Value.pszValue = _T("&-loopback&;");
options[3].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL ;
options[3].Value.pszValue = NULL;
options[4].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
options[4].Value.dwValue = 0
  举这个例子的原因是因为这五个选项正好是我们设置代理服务器要用到的选项,现在一个一个的来进行说明。
  1. INTERNET_PER_CONN_FLAGS
Sets or retrieves the connection type. The Valuemember will contain one or more of the following values:
设置或者恢复连接类型,值成员将包含一个或者多个如下的值:
PROXY_TYPE_DIRECT
The connection does not use a proxy server.
连接不使用代理服务器。
PROXY_TYPE_PROXY
The connection uses an explicitly set proxy server.
连接使用一个显式设置的代理服务器
PROXY_TYPE_AUTO_PROXY_URL
The connection downloads and processes an automatic configuration script at a specified URL.
在某个指定的URL上此连接下载和处理一个自动配置脚本,没明白啥意思,不过也用不到
PROXY_TYPE_AUTO_DETECT
The connection automatically detects settings.
连接自动检查设置,这个也用不到
  再看我们例子里的设置
options[0].dwOption = INTERNET_PER_CONN_FLAGS ;
options[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
设置成&PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY 这个代表启用代理.
也就是下图的那个勾就勾上了&
如果只设置成PROXY_TYPE_DIRECT
options[0].Value.dwValue = PROXY_TYPE_DIRECT ;
则表示取消代理。
也就是上图的勾没了 。 &
  2. INTERNET_PER_CONN_PROXY_SERVER
Sets or retrieves a string containing the proxy servers.
设置或恢复包含代理服务器信息的字符串
  也看例子程序里的设置&
options[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER ;
options[1].Value.pszValue = _T("http=127.0.0.1:8888;");
  因为是个字符串,所以是pszValue ,内容的格式如下:
  &http=127.0.0.1:8888 ; & 也可以是 &http=127.0.0.1:8888 ;https=192.168.1.88:8080 ;&&
  能看出来规律吗。就是用分号分开不同协议的代理设置,用等号分开协议名和代理服务器的地址和端口。
  那么类推一下,如果还需要再设置个FTP协议的代理服务器,代理服务器的地址是本机,端口是8888,那么应该怎么设置呢.
  &http=127.0.0.1:8888 ;https=192.168.1.88:8080 ;ftp=127.0.0.1:8888;& &
  http=127.0.0.1:8888 ;
  http=127.0.0.1:8888 ;https=192.168.1.88:8080 ;
  http=127.0.0.1:8888 ;https=192.168.1.88:8080 ;ftp=127.0.0.1:8888;&& &
  看明白了吧,如果U自认还是正常人类的话。那么我们继续往下了。&&&
  3. INTERNET_PER_CONN_PROXY_BYPASS&
  一样的先看定义
Sets or retrieves a string containing the URLs that do not use the proxy server.
设置或者恢复不使用代理的网址。
  看他的命名就基本能猜出来他是干什么的了,就是设置一些网址直接访问网络,而不使用代理。这个选项是很有用处的,例如,你想使用代理访问国外网站,但是使用了代理后,很多的国内网站又访问不了,怎么办呢,很简单,把网内的网站加到这个例外情况(忽略列表)里就可以了。&&&&&
  同样的,再看看我们例子里的设置&
options[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS ;
options[2].Value.pszValue = _T("&-loopback&;");
  至于loopback是什么,可自行GOOGLE或BAIDU。 & & &
  后面还有两个选项就不详细讲了,一个设NULL,一个设0就可以了。
  前面的代码综合起来就是
INTERNET_PER_CONN_OPTION_LIST
INTERNET_PER_CONN_OPTION options[5];
// 有几个选项需要设置这里就分配几个
list.pszConnection = NULL;
// 为NULL,表示默认的连接
list.dwOptionCount = 5 ;
options的个数
list.dwOptionError = 0 ;
list.pOptions =
// 指向options,就是选项的数组
options[0].dwOption = INTERNET_PER_CONN_FLAGS ;
options[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
options[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER ;
options[1].Value.pszValue = _T("http=127.0.0.1:8888;");
options[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS ;
options[2].Value.pszValue = _T("&-loopback&;");
options[3].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL ;
options[3].Value.pszValue = NULL;
options[4].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
options[4].Value.dwValue = 0
InternetSetOption(
  NULL,
  INTERNET_OPTION_PER_CONNECTION_OPTION,
  &options,
  sizeof(options)
  二. INTERNET_OPTION_PROXY_SETTINGS_CHANGED&& 95
Alerts the current WinInet instance that proxy settings have changed and that they must update with the new settings. To alert all available WinInet instances, set the Buffer parameter of InternetSetOption to NULL and BufferLength to 0 when passing this option. This option can be set on the handle returned by InternetConnect or HttpOpenRequest.
通知当前的WinInet实例代理设置已经被改变了,必须去更新他的代理设置,如果要通知所有有效的WinInet实例的话,第三个参数设成NULL,最后一个参数设成0 。
  我们当然是想通知所有的WinInet实例了,所以这里后面两个参数设成NULL和0就行了。
InternetSetOption(
  NULL,
  INTERNET_OPTION_PROXY_SETTINGS_CHANGED,
  这一步重要,使用INTERNET_OPTION_PER_CONNECTION_OPTION后,设置其实已经改变了,但是还不能立即生效,需要重启后才能生效,但如果想立即生效,就要用到INTERNET_OPTION_PROXY_SETTINGS_CHANGED了。
  好了,再和前面的代码综合一下,另外了加了点注释 。&&
INTERNET_PER_CONN_OPTION options[5] ;
options[0].dwOption = INTERNET_PER_CONN_FLAGS ;
options[0].Value.dwValue = PROXY_TYPE_DIRECT | PROXY_TYPE_PROXY;
options[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER ;
options[1].Value.pszValue = _T("http=127.0.0.1:8888;");
options[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS ;
options[2].Value.pszValue = _T("&-loopback&;");
options[3].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL ;
options[3].Value.pszValue = NULL;
options[4].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
options[4].Value.dwValue = 0
// 改变设置
InternetSetOption(
  NULL,
  INTERNET_OPTION_PER_CONNECTION_OPTION,
  &options,
  sizeof(options)
// 通知所有的WINET实例,设置已经改变了,请立即更新代理设置
InternetSetOption(
  NULL,
  INTERNET_OPTION_PROXY_SETTINGS_CHANGED,
  在C#中调用API,尤其涉及到过多结构体的时候,非常的麻烦,所以为了方便,前面的例子我使用了C++来写。至于C#中如何实现这些功能,各位可自行看,原理都是一样的,代码见 附录 -WinINetProxy.cs& 文件 - SetToWinINET 方法.&
  为了实现启动的时候自动设置代理,退出的时候自动退出代理的功能,我们需要在FrmMain.cs 做两处变动& 。
  第一处FrmMain构造函数的最后。
  原来是
proxy.Start(Config.ListenPort);
  现在变更为
if (proxy.Attach())
// 自动设置代理成功后
proxy.Start(Config.ListenPort);
// 启动代理服务器
  第二处FrmMain_FormClosed事件的代码里
  原来是
if (proxy != null)
  proxy.Stop();
  变更为
if (proxy != null)
  proxy.Stop();
  proxy.Detach();
  从上面可以看到在程序启动的时候,我们增加了一个proxy.Attach(),而在程序退出时又增加了一个proxy.Detach()。Attach是自动设置代理,Detach是取消代理。这两个方法全部是增加在Proxy类里的&
1 internal bool Attach()
3   if (!this.IsAttached)
5     return this.winINetProxy.SetToWinINET("DefaultLAN");
7   return true;
10 internal bool Detach()
12   if (this.IsAttached)
14     return this.winINetProxy.SetToWinINET("DefaultLAN");
16   return true;
  这两个方法都是调用了winINetProxy.SetToWinNet方法。winINetProxy 是WinInetPorxy类的一个实例,WinInetProxy类就是前面提到的设置代理和取消代理的实现类 。 &
&& & & & & & & & & & & & & & & & & & & & & & & & & &
阅读(...) 评论()

我要回帖

更多关于 赵本山有关系的女人 的文章

 

随机推荐