`
bollaxu
  • 浏览: 219911 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用fastcgi c api时注意的问题

 
阅读更多

最近用fastcgi的c语言api写服务,发现一个问题。我用nginx来接收请求,并通过fastcgi_pass传递到c程序。在用curl测试请求的时候,发现c程序是有被调用的,但是nginx返回的响应一直是502 "upstream closed prematurely FastCGI stdout while reading response header from upstream"。在网上找了很久,也有同样的问题,但是一般都是说原因是printf的时候没有按照http协议,比如说一定要printf("Content-type: text/html \r\n\r\n")。我按照这个格式写了,但还是出错。最后发现是由于include了c和c++的一些头文件,比如,下面的代码就有可能出现这样的问题(也有可能不出现问题):

 

#include "fcgi_stdio.h"
#include <iostream>
#include <string>
#include <map>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    while(FCGI_Accept() >= 0)     
    {
		//////////////////////////////////////////////////////////////////////////
		//get content type and length
		//////////////////////////////////////////////////////////////////////////
		printf("Content-type: text/*\r\n\r\n"); 
		printf("<title>FastCGI Hello! (C, fcgi_stdio library)</title>\n");
    }
}

在官方的api使用例子里面,只有include “fcgi_stdio.h”和“stdlib.h”这两个头文件。于是我看了一下fcgi_stdio.h这个文件,发现它定义了一个宏,也叫printf,而事实上是调用了FCGI_printf这个函数。 而include其他的头文件可能会导致链接的时候链接到原来的printf实现,所以最保险的做法是:

 

#include "fcgi_stdio.h"
#include <iostream>
#include <string>
#include <map>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    while(FCGI_Accept() >= 0)     
    {
		//////////////////////////////////////////////////////////////////////////
		//get content type and length
		//////////////////////////////////////////////////////////////////////////
		FCGI_printf("Content-type: text/*\r\n\r\n"); 
		FCGI_printf("<title>FastCGI Hello! (C, fcgi_stdio library)</title>\n");
    }
}

这样就万无一失了。

分享到:
评论

相关推荐

    FastCGI支持库

    在使用FastCGI支持库时,开发人员需要注意以下几点: 1. **性能优化**:通过调整FastCGI进程数量、内存限制等参数,可以优化服务器性能和资源利用率。 2. **错误处理**:正确处理网络通信错误和应用错误,确保服务...

    kcgi:CC ++的最小CGI和FastCGI库

    它旨在提供一个简洁、易于理解和使用的API,以便开发者能够快速构建Web应用程序。在本文中,我们将深入探讨`kcgi`库的关键特性、工作原理以及如何使用它来开发Web服务。 1. **CGI和FastCGI简介** - CGI是一种标准...

    fcgi:现代C ++中的FastCGI实现

    C ++中的FastCGI实现{#mainpage} Dmitigr Fcgi(以下简称Fcgi)-是一种可靠,易于使用且高性能的协议,以C ++编写。 Fcgi是项目的一部分。 注意,该软件为“测试版”质量,并且API随时可能更改!文献资料生成的文档...

    php扩展开发

    需要注意的是,由于PHP的核心是由C语言编写的,因此在使用C++时需要特别注意兼容性和稳定性的问题。 - **PHP如何表示一个C指针**:在PHP中,可以通过资源(Resource)来间接表示C指针。例如,当打开一个文件时,返回的...

    用C++开发Web 商用程序

    3.2 FastCGI:为了解决CGI的效率问题,FastCGI应运而生。FastCGI保持长期运行的进程,可以处理多个请求,显著提高性能。C++开发者可以使用如FCGI库来实现FastCGI接口。 四、模板引擎和MVC模式 4.1 模板引擎:C++中...

    一个高性能的HTTP服务器来加速基于Swoole的LaravelLumen应用

    9. **安全性**:使用Swoole需要注意安全问题,例如防止内存泄漏、处理异常情况以及正确关闭连接等。此外,由于Swoole服务器常驻内存,更新代码时需要重新启动服务,确保新代码生效。 10. **最佳实践**:在实际应用...

    CGI源码库文件

    然而,需要注意的是,CGI程序通常对每个请求都会启动新的进程,这可能导致性能问题,特别是在高并发的场景下。因此,现代Web开发中,CGI已经被FastCGI、CGI-PHP、WSGI等更高效的接口所取代,它们允许多个请求复用...

    基于PHP的sg807傻瓜式免费自助建站系统 php版.zip

    1. 安全性:使用PHP建站需要注意SQL注入、XSS攻击等常见安全问题,系统应内置安全防护机制。 2. 更新与维护:定期更新PHP版本和系统补丁,以应对新出现的安全漏洞。 3. 日志管理:系统应提供日志记录功能,便于故障...

    最新版易支付V6.99 支付程序需要的自取去授权版 支持自定义套餐价格功能权限

    - Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。6.2 版本引入了一些新的命令和改进,如JSON 数据类型的支持等。 5. **进程管理工具:**...

    php-7.4.15-nts-Win32-vc15-x64.zip

    标题中的"php-7.4.15-nts-Win32-vc15-x64.zip"揭示了这是PHP编程语言的一个特定版本,7.4.15,针对Windows操作系统设计,是64位...同时,由于使用了非线程安全版本,开发者需要注意避免使用多线程特性,以免引发问题。

    cgic.rar_cgi_cgic_网页 cgi

    然而,需要注意的是,由于CGI程序每次请求都会启动一个新的进程,这可能导致服务器资源的浪费,因此在高并发场景下,可能会考虑使用更高效的解决方案,如FastCGI或CGI的替代技术,如PHP-FPM或WSGI。

    PHP架构师 指南 设计

    - `__toString()`: 当对象被当作字符串使用时调用。 - `__get()`: 当试图获取一个不存在或者不可见的成员变量时调用。 - `__set()`: 当试图给对象设置一个不存在或者不可见的成员变量时调用。 - `__call()`: 当试图...

    Nginx服务器中配置GeoIP模块来拦截指定国家IP

    Nginx服务器中配置GeoIP模块来拦截特定国家的IP是一项常见的网络安全措施,特别是对于那些希望限制特定地区访问的网站。...但要注意,频繁的IP查找可能会增加服务器负载,因此在大规模部署时需要考虑性能影响。

    nginx-publish-stream

    ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -c:a aac -ar 44100 -ac 2 -b:v 500k -maxrate 500k -bufsize 1000k -r 25 -g 50 -hls_time 10 -hls_list_size 6 -f hls rtmp://localhost/live/myStream ...

    WebServer:Web服务器的C ++实现

    每个连接可以由一个单独的线程或进程处理,但要注意同步和资源管理的问题。 7. **性能优化**:在高并发场景下,可能需要考虑缓存策略、内存池、预读取等优化手段。 8. **安全性**:确保服务器的安全性非常重要,...

    webdevery-october

    它的语法吸收了C语言、Java和Perl的特点,易于学习,且功能强大,适合各类Web开发者使用。 1. **PHP基础语法** PHP语句通常以`开始,以`?&gt;`结束。它可以用来输出变量、执行控制结构(如if-else、for、while循环)...

    ObjectCog-开源

    在使用ObjectCog时,开发者需要注意以下几点: 1. **配置管理**:ObjectCog 的配置文件通常位于 `/Library/ObjectCog` 目录下,可以通过编辑这些文件来设置服务器的端口、日志级别和其他高级选项。 2. **安全考虑**...

    site-prokol.net

    - 需要注意SQL注入、XSS攻击(跨站脚本)和CSRF(跨站请求伪造)等网络安全问题。 - 使用预处理语句(如PDO的预编译)防止SQL注入,过滤用户输入以防御XSS,使用令牌防止CSRF。 6. **PHP版本更新**: - PHP从...

Global site tag (gtag.js) - Google Analytics