在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再进阶(请求和响应)官方例子相关推荐

  1. JavaWeb框架(一):Web入门,Http的请求和响应,https介绍,Web实战自定义服务器

    Servlet入门 MVC实战项目 仓储管理系统 JavaWeb入门介绍 Http协议 Http请求数据格式 Http响应数据格式 Web实战Demo:自定义服务器 对比Https协议 总结 Redi ...

  2. UE4(七) 墙体破碎效果在Matinee官方例子里的应用

    PS:打开官方的Matinee例子,可以看到角色撞到墙的时候有碎屑掉落,这就是破碎效果 关键组件:RadialForceActor 属性设置,参数更改,主要Impulse冲击力 要破碎的物体属性应设为 ...

  3. WEB请求处理二:Nginx请求反向代理

    上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...

  4. WEB 请求处理二:Nginx 请求 反向代理

    上一篇<WEB请求处理一:浏览器请求发起处理>,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建立TCP连接,发送HTTP请求.本文将讲述请求到达反向代理服务器的一个处理 ...

  5. HTTP协议、【HTTP请求、响应格式】及一次HTTP请求的完整过程

    HTTP协议及一次[请求.响应]的完整过程 HTTP协议简介 HTTP协议工作原理 一次HTTP请求的完整过程 浏览器根据域名解析IP地址 浏览器通过IP地址与WEB服务器建立一个TCP连接 浏览器给 ...

  6. Fiddler修改请求、响应数据

    修改请求数据 (1)打开Fiddler->Rules->Automatic Breakpoints,点击[Before Requests]. 这种方式设置的断点对所有HTTP请求有效.选择 ...

  7. Postman里如何把某个HTTP的请求和响应作为example保存

    每个HTTP请求,默认是没有example例子的,有时候我们想把某个请求和响应保存下来,这样即使哪一天远端系统不可用,至少在postman里这些响应仍然可供参考. 点上图的超链接,可以看到Add Ex ...

  8. CEF3:拦截http request请求和response响应(包括ajax请求和响应也能拦截到)

    文章目录 前言 思路 代码 前言 笔者在项目开发中有需求,需要拦截 js中 发起的 http 请求和响应数据 写到文件中,方便给开发人员或者测试人员查看.笔者拿到这个需求第一反应是,cef肯定有这种接 ...

  9. Java web—Servlet的请求与响应

    前言:         在家上网课快上疯了╰(‵□′)╯,上课连课本都没有,太难受了呜呜呜~, 只能在blog里记录一下这段时间的学习的内容,太难了- 一.servlet概述: 运行在WEB服务器端的 ...

最新文章

  1. Python使用问题汇总
  2. 安装与使用 Trac 来管理项目
  3. 【控制】控制学习路线资源整理
  4. Redis集群技术及Codis实践
  5. MyBatis 与Spring 整合分析
  6. HTML5新布局元素布局,HTML5新的布局元素
  7. continue详细讲解
  8. 浅谈-tomcat中的项目之间的访问
  9. 【探路者】第三周立会报告5(总第17次)
  10. Android Media Playback 中的MediaPlayer的用法及注意事项(一)
  11. Dynamics CRM2013 6.1.1.1143版本插件注册器的一个bug
  12. 处理器架构 (四) ARM指令集
  13. VBA代码宝+代码助手
  14. WIN7系统下如何设置护眼设置
  15. matlab 广义特征,特征值 特征向量 广义特征值 matlab
  16. php截取部分pdf,如何将一个pdf文档拆分成多个
  17. Aspose.Slides for Python演示文稿指定幻灯片放映设置
  18. 不学好数学也想当数据科学家?不存在的
  19. 阶段总结【博学谷学习记录】超强总结,用心分享
  20. 重要开源协议的比较(BSD,Apache,GPL,LGPL,MIT) – 整理

热门文章

  1. ideajdk升级_JDK升级为13
  2. Android安全笔记-Intent和PendingIntent基本概念
  3. Qt|C++工作笔记-QVector与Vector去重复的值
  4. Linux学习笔记-编译与链接的过程
  5. C++工作笔记-map有自动排序的功能
  6. oracle脚本导入mysql数据库_oracle脚本导入mysql数据库
  7. mysql 5.6 禁用 innodb_MYSQL 5.6中禁用INNODB引擎
  8. 计算机组成原理整机实验报告,计算机组成原理加器实验报告.doc
  9. mysql blob图片类型存储bug解决:索引超出了数组界限错误_索引超出了数组界限(Microsoft.SqlServer.Smo)...
  10. c语言实参和形参占用存储单元_C语言判断题题库