web(七)---fastcgi再进阶(请求和响应)官方例子
在fast-cgi源码的examples文件夹下有很多例子, 下面给出echo例子, 编译运行方法同上几节.
fast-cgi的API google之.
http://fossies.org/dox/fcgi-2.4.0/fcgiapp_8h.html#a32f6950798054a70404ce24c22ea28b9
echo-cpp.cpp
#include <stdlib.h> #ifdef _WIN32 #include <process.h> #else #include <unistd.h> extern char ** environ; #endif #include "fcgio.h" #include "fcgi_config.h" // HAVE_IOSTREAM_WITHASSIGN_STREAMBUFusing namespace std;// Maximum number of bytes allowed to be read from stdin static const unsigned long STDIN_MAX = 1000000;static void penv(const char * const * envp) {cout << "<PRE>\n";for ( ; *envp; ++envp){cout << *envp << "\n";}cout << "</PRE>\n"; }static long gstdin(FCGX_Request * request, char ** content) {char * clenstr = FCGX_GetParam("CONTENT_LENGTH", request->envp);unsigned long clen = STDIN_MAX;if (clenstr){clen = strtol(clenstr, &clenstr, 10);if (*clenstr){cerr << "can't parse \"CONTENT_LENGTH="<< FCGX_GetParam("CONTENT_LENGTH", request->envp)<< "\"\n";clen = STDIN_MAX;}// *always* put a cap on the amount of data that will be readif (clen > STDIN_MAX) clen = STDIN_MAX;*content = new char[clen];cin.read(*content, clen);clen = cin.gcount();}else{// *never* read stdin when CONTENT_LENGTH is missing or unparsable*content = 0;clen = 0;}// Chew up any remaining stdin - this shouldn't be necessary// but is because mod_fastcgi doesn't handle it correctly.// ignore() doesn't set the eof bit in some versions of glibc++// so use gcount() instead of eof()...do cin.ignore(1024); while (cin.gcount() == 1024);return clen; }int main (void) {int count = 0;long pid = getpid();streambuf * cin_streambuf = cin.rdbuf();streambuf * cout_streambuf = cout.rdbuf();streambuf * cerr_streambuf = cerr.rdbuf();FCGX_Request request;FCGX_Init();FCGX_InitRequest(&request, 0, 0);while (FCGX_Accept_r(&request) == 0){// Note that the default bufsize (0) will cause the use of iostream// methods that require positioning (such as peek(), seek(),// unget() and putback()) to fail (in favour of more efficient IO).fcgi_streambuf cin_fcgi_streambuf(request.in);fcgi_streambuf cout_fcgi_streambuf(request.out);fcgi_streambuf cerr_fcgi_streambuf(request.err);#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUFcin = &cin_fcgi_streambuf;cout = &cout_fcgi_streambuf;cerr = &cerr_fcgi_streambuf; #elsecin.rdbuf(&cin_fcgi_streambuf);cout.rdbuf(&cout_fcgi_streambuf);cerr.rdbuf(&cerr_fcgi_streambuf); #endif// Although FastCGI supports writing before reading,// many http clients (browsers) don't support it (so// the connection deadlocks until a timeout expires!).char * content;unsigned long clen = gstdin(&request, &content);cout << "Content-type: text/html\r\n""\r\n""<TITLE>echo-cpp</TITLE>\n""<H1>echo-cpp</H1>\n""<H4>PID: " << pid << "</H4>\n""<H4>Request Number: " << ++count << "</H4>\n";cout << "<H4>Request Environment</H4>\n";penv(request.envp);cout << "<H4>Process/Initial Environment</H4>\n";penv(environ);cout << "<H4>Standard Input - " << clen;if (clen == STDIN_MAX) cout << " (STDIN_MAX)";cout << " bytes</H4>\n";if (clen) cout.write(content, clen);if (content) delete []content;// If the output streambufs had non-zero bufsizes and// were constructed outside of the accept loop (i.e.// their destructor won't be called here), they would// have to be flushed here. }#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUFcin = cin_streambuf;cout = cout_streambuf;cerr = cerr_streambuf; #elsecin.rdbuf(cin_streambuf);cout.rdbuf(cout_streambuf);cerr.rdbuf(cerr_streambuf); #endifreturn 0; }
转载于:https://www.cnblogs.com/helloweworld/p/4126964.html
web(七)---fastcgi再进阶(请求和响应)官方例子相关推荐
- JavaWeb框架(一):Web入门,Http的请求和响应,https介绍,Web实战自定义服务器
Servlet入门 MVC实战项目 仓储管理系统 JavaWeb入门介绍 Http协议 Http请求数据格式 Http响应数据格式 Web实战Demo:自定义服务器 对比Https协议 总结 Redi ...
- UE4(七) 墙体破碎效果在Matinee官方例子里的应用
PS:打开官方的Matinee例子,可以看到角色撞到墙的时候有碎屑掉落,这就是破碎效果 关键组件:RadialForceActor 属性设置,参数更改,主要Impulse冲击力 要破碎的物体属性应设为 ...
- WEB请求处理二:Nginx请求反向代理
上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...
- WEB 请求处理二:Nginx 请求 反向代理
上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...
- HTTP协议、【HTTP请求、响应格式】及一次HTTP请求的完整过程
HTTP协议及一次[请求.响应]的完整过程 HTTP协议简介 HTTP协议工作原理 一次HTTP请求的完整过程 浏览器根据域名解析IP地址 浏览器通过IP地址与WEB服务器建立一个TCP连接 浏览器给 ...
- Fiddler修改请求、响应数据
修改请求数据 (1)打开Fiddler->Rules->Automatic Breakpoints,点击[Before Requests]. 这种方式设置的断点对所有HTTP请求有效.选择 ...
- Postman里如何把某个HTTP的请求和响应作为example保存
每个HTTP请求,默认是没有example例子的,有时候我们想把某个请求和响应保存下来,这样即使哪一天远端系统不可用,至少在postman里这些响应仍然可供参考. 点上图的超链接,可以看到Add Ex ...
- CEF3:拦截http request请求和response响应(包括ajax请求和响应也能拦截到)
文章目录 前言 思路 代码 前言 笔者在项目开发中有需求,需要拦截 js中 发起的 http 请求和响应数据 写到文件中,方便给开发人员或者测试人员查看.笔者拿到这个需求第一反应是,cef肯定有这种接 ...
- Java web—Servlet的请求与响应
前言: 在家上网课快上疯了╰(‵□′)╯,上课连课本都没有,太难受了呜呜呜~, 只能在blog里记录一下这段时间的学习的内容,太难了- 一.servlet概述: 运行在WEB服务器端的 ...
最新文章
- Python使用问题汇总
- 安装与使用 Trac 来管理项目
- 【控制】控制学习路线资源整理
- Redis集群技术及Codis实践
- MyBatis 与Spring 整合分析
- HTML5新布局元素布局,HTML5新的布局元素
- continue详细讲解
- 浅谈-tomcat中的项目之间的访问
- 【探路者】第三周立会报告5(总第17次)
- Android Media Playback 中的MediaPlayer的用法及注意事项(一)
- Dynamics CRM2013 6.1.1.1143版本插件注册器的一个bug
- 处理器架构 (四) ARM指令集
- VBA代码宝+代码助手
- WIN7系统下如何设置护眼设置
- matlab 广义特征,特征值 特征向量 广义特征值 matlab
- php截取部分pdf,如何将一个pdf文档拆分成多个
- Aspose.Slides for Python演示文稿指定幻灯片放映设置
- 不学好数学也想当数据科学家?不存在的
- 阶段总结【博学谷学习记录】超强总结,用心分享
- 重要开源协议的比较(BSD,Apache,GPL,LGPL,MIT) – 整理
热门文章
- ideajdk升级_JDK升级为13
- Android安全笔记-Intent和PendingIntent基本概念
- Qt|C++工作笔记-QVector与Vector去重复的值
- Linux学习笔记-编译与链接的过程
- C++工作笔记-map有自动排序的功能
- oracle脚本导入mysql数据库_oracle脚本导入mysql数据库
- mysql 5.6 禁用 innodb_MYSQL 5.6中禁用INNODB引擎
- 计算机组成原理整机实验报告,计算机组成原理加器实验报告.doc
- mysql blob图片类型存储bug解决:索引超出了数组界限错误_索引超出了数组界限(Microsoft.SqlServer.Smo)...
- c语言实参和形参占用存储单元_C语言判断题题库