我需要编写一个C ++接口,它可以读取我们的数据结构,并使用http协议提供基于查询的o / p。
服务器需求
它应该能够同时为100个客户提供服务。
为何选择C ++
所有代码都是用C ++编写的。所以我们需要在C ++中编写一个http层。这就是我选择C ++而不是更传统的网络编程语言的原因。
我正在考虑使用nginx来提供静态文件,并使用其代理传递来与C ++通信。
我找到了两种方法:
编写FastCGI c ++模块。
编写node.js c ++模块。
如果您有
请根据以往的经验列出每种方法的优缺点?
答案 0 :(得分:18)
这里没有人似乎已经解决了实际问题,尽管已经提供了一些很好的解决方案。我已经能够为nginx构建C ++模块,只需进行一些小改动。
通过这三个步骤,您的模块应该编译,构建,链接并实际工作。
答案 1 :(得分:12)
我想我会继续使用Nginx模块devlopment http://www.evanmiller.org/nginx-modules-guide.html
为什么?
答案 2 :(得分:10)
您要问的基本上是如何将包含数据结构的c ++流程转换为Web服务器。这可能不是最佳方式。 (然后,也许它就是你的情况。这取决于你想要暴露的c ++进程接口的复杂性。)
无论如何,我会尝试在c ++进程和可以执行http工作的客户端之间使用一个小的http前端,并使用一些简单的消息传递协议(如ZeroMQ/zmq与c ++后端进程通信。
c / c ++中的zmq非常简单,非常高效且速度非常快。使用zmq,您可以非常快速地在python中设置一个简单的Web服务器前端,或者您喜欢的具有zmq bindings的任何语言,并使该前端与使用zmq的后端c ++进程异步或同步地进行通信。
如果您正在研究使用zmq,c++ examples和the guide是不错的起点。
对于Node.js,还有a few examples。
答案 3 :(得分:5)
尝试使用G-WAN,它允许您直接使用c ++应用程序。
答案 4 :(得分:0)
您可以尝试nginx c function
使用简单,并在应用层wiki for nginx c function
上内置了nginx缓存示例代码:
#include <stdio.h>
#include <ngx_http_c_func_module.h>
/*** build the program as .so library and copy to the preferred place for nginx to link this library ***/
/*** gcc -shared -o libcfuntest.so -fPIC cfuntest.c ***/
/*** cp libcfuntest.so /etc/nginx/ ***/
int is_service_on = 0;
void ngx_http_c_func_init(ngx_http_c_func_ctx_t* ctx) {
ngx_http_c_func_log(info, ctx, "%s", "Starting The Application");
is_service_on=1;
}
void my_app_simple_get_greeting(ngx_http_c_func_ctx_t *ctx) {
ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get");
ngx_http_c_func_write_resp(
ctx,
200,
"200 OK",
"text/plain",
"greeting from ngx_http_c_func testing"
);
}
void my_app_simple_get_args(ngx_http_c_func_ctx_t *ctx) {
ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get_args");
ngx_http_c_func_write_resp(
ctx,
200,
"200 OK",
"text/plain",
ctx->req_args
);
}
void my_app_simple_get_token_args(ngx_http_c_func_ctx_t *ctx) {
ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get_token_args");
char * tokenArgs = ngx_http_c_func_get_query_param(ctx, "token");
if (! tokenArgs) {
ngx_http_c_func_write_resp(
ctx,
401,
"401 unauthorized",
"text/plain",
"Token Not Found"
);
} else {
ngx_http_c_func_write_resp(
ctx,
401,
"401 unauthorized",
"text/plain",
tokenArgs
);
}
}
void my_app_simple_post(ngx_http_c_func_ctx_t *ctx) {
ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_post");
ngx_http_c_func_write_resp(
ctx,
202,
"202 Accepted and Processing",
"text/plain",
ctx->req_body
);
}
void my_app_simple_get_no_resp(ngx_http_c_func_ctx_t *ctx) {
ngx_http_c_func_log_info(ctx, "Calling back and log from my_app_simple_get_no_resp");
}
void ngx_http_c_func_exit(ngx_http_c_func_ctx_t* ctx) {
ngx_http_c_func_log(info, ctx, "%s\n", "Shutting down The Application");
is_service_on = 0;
}
答案 5 :(得分:0)
只需将HTTP前端添加到您的C ++代码中,就可以使用诸如Beast之类的库,然后从nginx将proxy_pass传递到您的C ++服务器。根据您的用途,您可能根本不需要Nginx。