http:\/\/

| 微软 |

【www.guakaob.com--微软】

篇一:《C++调用HTTP实现方式》

C++调用HTTP实现方式

2011-09-24 17:00:52| 分类: |字号 订阅

Http访问有两种方式,GET和POST,就编程来说GET方式相对简单点,它不用向服务器提交数据,程序中使用POST方式,

提交数据并从服务器获取返回值。

为实现Http访问,微软提供了二套API:WinINet, WinHTTP。WinHTTP比WinINet更加安全和健壮,可以这么认为WinHTTP是WinINet的升级版本。

程序中,通过一个宏的设置来决定是使用WinHttp还是WinINet。

#define USE_WINHTTP //Comment this line to user wininet.

下面来说说实现Http访问的流程(两套API都一样的流程):

1, 首先我们打开一个Session获得一个HINTERNET session句柄;

2, 然后我们使用这个session句柄与服务器连接得到一个HINTERNET connect句柄; 3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄; 4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据; 5, 最后依次关闭request,connect,session句柄。

/***********************定义HTTP发送所用方法***********************************/ HINTERNET OpenSession(LPCWSTR userAgent = 0)

{

#ifdef USE_WINHTTP

return WinHttpOpen(userAgent, NULL, NULL, NULL, NULL);;

#else

return InternetOpen(userAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

#endif

}

HINTERNET Connect(HINTERNET hSession, LPCWSTR serverAddr, int portNo) {

#ifdef USE_WINHTTP

return WinHttpConnect(hSession, serverAddr, (INTERNET_PORT) portNo, 0); #else

return InternetConnect(hSession, serverAddr, portNo, NULL, NULL,

INTERNET_SERVICE_HTTP, 0, 0);

#endifhttp:\/\/

}

HINTERNET OpenRequest(HINTERNET hConnect, LPCWSTR verb, LPCWSTR objectName, int scheme)

{

DWORD flags = 0;

#ifdef USE_WINHTTP

if (scheme == INTERNET_SCHEME_HTTPS) {

flags |= WINHTTP_FLAG_SECURE;

}

return WinHttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags); #else

if (scheme == INTERNET_SCHEME_HTTPS) {

flags |= INTERNET_FLAG_SECURE;

}

return HttpOpenRequest(hConnect, verb, objectName, NULL, NULL, NULL, flags, 0); #endif

}

BOOL AddRequestHeaders(HINTERNET hRequest, LPCWSTR header)

{

SIZE_T len = lstrlenW(header);

#ifdef USE_WINHTTP

return WinHttpAddRequestHeaders(hRequest, header, DWORD(len),

WINHTTP_ADDREQ_FLAG_ADD);

#else

return HttpAddRequestHeaders(hRequest, header, DWORD(len),

HTTP_ADDREQ_FLAG_ADD);

#endif

}

BOOL SendRequest(HINTERNET hRequest, const void* body, DWORD size) {

#ifdef USE_WINHTTP

return WinHttpSendRequest(hRequest, 0, 0, const_cast<void*>(body), size, size, 0); #else

return HttpSendRequest(hRequest, 0, 0, const_cast<void*>(body), size);

#endif

}

BOOL EndRequest(HINTERNET hRequest)

{

#ifdef USE_WINHTTP

return WinHttpReceiveResponse(hRequest, 0);

#else

// if you use HttpSendRequestEx to send request then use HttpEndRequest in here! return TRUE;

#endif

}

BOOL QueryInfo(HINTERNET hRequest, int queryId, char* szBuf, DWORD* pdwSize) {

#ifdef USE_WINHTTP

return WinHttpQueryHeaders(hRequest, (DWORD) queryId, 0, szBuf, pdwSize, 0); #else

return HttpQueryInfo(hRequest, queryId, szBuf, pdwSize, 0);

#endif

}

BOOL ReadData(HINTERNET hRequest, void* buffer, DWORD length, DWORD* cbRead)

{

#ifdef USE_WINHTTP

return WinHttpReadData(hRequest, buffer, length, cbRead);

#else

return InternetReadFile(hRequest, buffer, length, cbRead);

#endif

}

void CloseInternetHandle(HINTERNET hInternet)

{

if (hInternet)

{

#ifdef USE_WINHTTP

WinHttpCloseHandle(hInternet);

#else

InternetCloseHandle(hInternet);

#endif

}

}

http:\/\/

/**********************************************************/

///通过Http方式发送短信

string SendSMS_HTTP(const long ececcid,const string & password ,const string & msisdn, const string &smsContent)

{

string rtnStr ="-1";

HINTERNET hSession = 0;

HINTERNET hConnect = 0;

HINTERNET hRequest = 0;

wstring strHeader(L"Content-type: application/x-// Test data

CrackedUrl crackedUrl(L"");

string StrPostData =

"ececcid=600000&password="+password+"&msisdn="+msisdn+"&smscontent="+smsContent+"&msgtype=5&longcode=";

StrPostData = string_To_UTF8(StrPostData);

// Open session.

hSession = OpenSession(L"HttpPost by ");

if (hSession == NULL) {

cout<<"Error:Open session!\n";http:\/\/

return "-1";

}

// Connect.

hConnect = Connect(hSession, crackedUrl.GetHostName(), crackedUrl.GetPort()); if (hConnect == NULL) {

cout<<"Error:Connect failed!\n";

return "-1";

}

// Open request.

hRequest = OpenRequest(hConnect, L"POST", crackedUrl.GetPath(),

crackedUrl.GetScheme());

if (hRequest == NULL) {

cout<<"Error:OpenRequest failed!\n";

return "-1";

}

// Add request header.

if (!AddRequestHeaders(hRequest, strHeader.c_str())) {

cout<<"Error:AddRequestHeaders failed!\n";

return "-1";

}

// Send post data.

if (!SendRequest(hRequest, StrPostData.c_str(), StrPostData.length())) {

cout<<"Error:SendRequest failed!\n";

return "-1";

}

// End request

if (!EndRequest(hRequest)) {

cout<<"Error:EndRequest failed!\n";

return "-1";

}

char szBuf[BUF_SIZE];

DWORD dwSize = 0;

szBuf[0] = 0;

// Query header info.

#ifdef USE_WINHTTP

int contextLengthId = WINHTTP_QUERY_CONTENT_LENGTH;

篇二:《http服务器》

编号____

课程设计报告

基于Linux C实现的HTTP服务器

学生姓名 专 业 学 号 指导老师 学 院

二〇一四 年 七 月

网络工程

计算机科学技术

目录

1.设计任务及要求 ............................................................................................................................ 1

1.1设计目的 ............................................................................................................................. 1 1.2设计要求 ............................................................................................................................. 1 2.工作原理及设计方案 .................................................................................................................... 1

2.1工作原理 ............................................................................................................................. 1 2.2设计方案 ............................................................................................................................. 2 2.3 开发环境 ............................................................................................................................ 2 2.4程序流程图 ......................................................................................................................... 2 2.5 核心代码 ............................................................................................................................ 4 2.5.1 主程序 ....................................................................................................................... 4 2.5.2 请求处理函数 ........................................................................................................... 4 2.5.3 响应请求及错误返回 ............................................................................................... 6 2.5.4 判断文件类型 ........................................................................................................... 7 2.5.5 执行CGI程序 .......................................................................................................... 7 2.5.6 判断请求的是否是cgi程序 .................................................................................... 8 2.5.7 CGI程序test试例 .................................................................................................... 8

3.实验测试........................................................................................................................................ 9

3.1实验准备 ............................................................................................................................. 9 3.2实验步骤 ............................................................................................................................. 9 3.3 实验截图 ............................................................................................................................ 9 3.4实验结果 ........................................................................................................................... 11 4.思考和总结 .................................................................................................................................. 11 参考资料......................................................................................................................................... 11

1.设计任务及要求

1.1设计目的

在linux的C语言环境下,编写一个HTTP服务器,能够通过浏览器访问静态页面(页面中含有图片)以及动态页面(用C编写的CGI脚本程序)。

1.2设计要求

1)要能实现get方法;

2)能响应请求的html页面;

3)能响应请求的jpg、gif等图片文件;

4)能请求编译后的CGI可执行脚本,并将输出重定向到浏览器页面。

2.工作原理及设计方案

2.1工作原理

HTTP协议工作流程:

1.首先客户机与服务器需要建立连接。指定服务器标识及端口号建立连接。 2.建立连接后,客户机发送一个请求给服务器,请求由3部分组成: 请求行、请求报头(可选)、请求正文(可选) (1).请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF

其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)

(2).请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息,每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。 (注意,请求报头结束要以两个回车换行字符标志,如“/r/n”,不同系统下有所不同)

(3).请求正文则常以POST携带的参数信息为主。

3.服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

4.客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户端与http服务器断开连接。

2.2设计方案

协议版本号:使用HTTP 1.1 请求方法:仅实现get方法 响应文件的类型:text/plain,

image/gif, image/jpg, image/jpeg

工作模式:多进程模式,每个进程单独处理一个请求。

2.3 开发环境

Vmware Workstation 9 虚拟机下ubuntu环境,用C语言进行开发,开发工具包括:gedit。http:\/\/

2.4程序流程图

图1.主程序

图2.请求处理程序http:\/\/

篇三:《HTTP协议》

HTTP协议

重要性: 无论是以后用webserverice ,还是用rest做大型架构,都离不开对HTTP协议的认识.

甚至可以简化的说:

webservice = http协议+XML

Rest = HTTP协议 + json

各种API,也一般是用http+XML/json来实现的.

往小说:做采集,小偷站,也需要对HTTP协议有所了解,

以及Ajax,对HTTP协议有了解之后,学习Ajax是非常容易理解的.

什么是协议:

答:计算机中的协议和现实中的协议是一样的, 一式双份/多份.

双方/多方都遵从共同的一个规范,这个规范就可以称为协议.

计算机只所以能全世界互通,协议是功不可没, 如果没有协议,计算机各说各话,根本谁都听不懂谁.

ftp, http , stmp,pop, tcp/ip协议.....

HTTP协议的工作流程

当你打开一个页面时,发生了什么?

0:原始状态:客户端和服务器之间,没有关系.

什么叫连接?:连接就是网络上的虚拟电路.

问: 浏览器能发送HTTP协议, HTTP协议一定要浏览器来发送吗?

答: 不是, HTTP既然是一种协议,那么只要满足这种协议,什么工具都可以发.

HTTP请求信息和响应信息的格式

请求:

(1)请求行

(2)请求头信息

(3)请求主体信息(可以没有)

(4) 头信息结束后和主体信息之间要空一行 请求行又分3部分

请求方法 请求路径 所用的协议

请求方法: GET POST PUT DELETE TRACE ,OPTIONS 所用的协议: 目前一般是HTTP/1.1, 0.9,1.0已经基本不用.

篇四:《为什么我的QQ登不上去》

服务器超时的可能性有以下几种:
1、你的网络没有正确的连接上
2、你的网络的连接速度要小于QQ的要求
3、QQ的服务器正在维护
4、设置中QQ网络类型与机器的网络类型不符(很少见)
这是我以前碰到的几种问题,希望能给你些帮助
建议您可参考以下设置:
1、首先请您检查下防火墙设置,建议暂时关闭防火墙;
2、可能是由于QQ系统调整引起的,所以会造成某些号段不能登陆,建议您可以稍后再进行尝试;
3、尝试使用选择登陆服务器(目前有三种模式,分别是UDP模式、TCP模式和会员VIP模式)
操作方法:在2005 Beta3版本登陆窗口的左下角高级设置――选择登陆服务器,依次选择UDP模式、TCP模式和会员VIP模式(仅提供给会员);
4、可能是您所使用的代理已经失效,更换代理或者不使用代理,即可正常登陆
操作方法:在2005 Beta3版本登陆窗口的左下角高级设置――网络设置――类型,选择不使用代理,或者其他模式(选择好代理后,请先测试下是否可以正常使用);
5、因局域网实行封锁限制(端口被封),所以造成您的QQ无法登陆
解决方法:尝试使用HTTP代理
操作方法:在2005 Beta3版本登陆窗口的左下角高级设置――网络设置――类型,选择HTTP代理(选择好代理后,请先测试下是否可以正常使用);
6、最后,
请您可以将本地的聊天记录清除(建议在清除前先备份,以免丢失)再登陆尝试。在2005beta3版本登陆窗口中先输入QQ号码――左下角 高级设置――清除记录――同时删除该帐号对应的所有聊天记录文件 打勾 ―― 输入QQ密码――确定 即可清除记录。 或者删除QQ安装目录下的相应号码文件夹,最后重新登陆即可。为什么我的QQ登不上去

还后一个百试百灵的方法:卸载原来的QQ程序,然后再下载一个最新版本的QQ的安装程序,并且安装,最后重启,那一定行。

本文来源:http://www.guakaob.com/jisuanjileikaoshi/328081.html

    热门标签

    HOT