【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方式发送短信
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登不上去》
服务器超时的可能性有以下几种:上一篇:字体名字大全唯美
下一篇:wps怎样做word目录