如何在 Web 服务器中使用 C++ 应用程序?
How to use a c++ application in web server?
我在 windows 中使用 C++ 控制台应用程序。我想在我的网站上使用这个应用程序,以便从客户端获取输入,然后调用这个应用程序来处理它,输出将转发到 Web 服务器。我听说过 COM DLL 但不知道如何为我的应用程序创建它。
使用 CGI:http://cgi.sourceforge.net/
如何从客户端获取输入?
getenv("QUERY_STRING")
如何将输出转发到网络服务器?
cout << "<html>\n";
你好世界 CGI:
#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hello World - First CGI Program</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>Hello World! This is my first CGI program</h2>\n";
cout << "<p>REQUEST_METHOD = " << getenv("REQUEST_METHOD") << "</p>\n";
cout << "<p>QUERY_STRING = " << getenv("QUERY_STRING") << "</p>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
甚至还有几个开发框架,包括Wt、cppcms、CSP等。 FastCGI的主线实现是C语言,直接支持包括C++在内的多种语言。
我推荐使用 C++ webtoolkit Wt(读作 Witty),位于 http://www.webtoolkit.eu/。
这个框架(带有集成的应用程序服务器)让您可以根据小部件和 signal/slot 连接来设计 Web 应用程序,并将大部分 Web 内容留给图书馆处理。由此产生的应用程序是面向对象的、严格类型化的并且完全可维护的。该库自动检测浏览器的功能并使用正确的方式呈现站点,从而避免浏览器错误。这里是an example of aplication using wt
另见 this thread。
您应该尝试创建一个 cgi 脚本,根据您的应用程序的需要,您应该使用 FastCGI(它不会在您每次调用时创建整个进程上下文)。
- CGI
您应该安装 Apache 服务器并激活 cgi 模块(通常默认激活)。
然后你可以开发一个c++程序,将可执行文件放入配置的CGI文件夹中,赋予正确的权限。这个 CGI 脚本应该进行某种进程间通信(它可以通过套接字或共享内存,第一个更容易)。
我希望您知道 CGI 脚本在 C/C++ + Apache 中是如何工作的,但它非常简单,总而言之,您会收到标准输入中的环境并将答案输入标准输出。
- FastCGI
你可以使用 apache,安装 fastcgi 模块并在你的程序中创建一个线程(它也可以在你的主循环中,但我不推荐)并将 apache 服务器 FastCGI 模块附加到你的守护进程。
最后但同样重要的是,您应该 运行 您的守护进程即服务。
PS : There are some framework options(like cppcms and wt), but since
you already have the daemon written i thought it would be a pain in
the ass to change everything (of course, it depends on a lot of
things, like the complexity and size of your application).
我的小组只是将其作为一个 class 项目来做,我们主要使用 cpp-netlib as a network library, but we also used curlpp 来处理一些小事。我们将其托管在 Amazon EC2 实例上,设置为 windows 服务器,您可以自由地执行 UI 任何您真正想要的操作。这是一个相当简单的项目,但走这条路并没有我想象的那么局限。希望有帮助
为了在 Windows 和 IIS 6 上实现高性能,您需要创建一个 ISAPI dll; in IIS 7 you will want to create a module。两者都不是特别微不足道,你将不得不做大量的阅读。
我在 windows 中使用 C++ 控制台应用程序。我想在我的网站上使用这个应用程序,以便从客户端获取输入,然后调用这个应用程序来处理它,输出将转发到 Web 服务器。我听说过 COM DLL 但不知道如何为我的应用程序创建它。
使用 CGI:http://cgi.sourceforge.net/
如何从客户端获取输入?
getenv("QUERY_STRING")
如何将输出转发到网络服务器?
cout << "<html>\n";
你好世界 CGI:
#include <iostream>
#include <cstdlib>
using namespace std;
int main ()
{
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hello World - First CGI Program</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>Hello World! This is my first CGI program</h2>\n";
cout << "<p>REQUEST_METHOD = " << getenv("REQUEST_METHOD") << "</p>\n";
cout << "<p>QUERY_STRING = " << getenv("QUERY_STRING") << "</p>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
甚至还有几个开发框架,包括Wt、cppcms、CSP等。 FastCGI的主线实现是C语言,直接支持包括C++在内的多种语言。
我推荐使用 C++ webtoolkit Wt(读作 Witty),位于 http://www.webtoolkit.eu/。
这个框架(带有集成的应用程序服务器)让您可以根据小部件和 signal/slot 连接来设计 Web 应用程序,并将大部分 Web 内容留给图书馆处理。由此产生的应用程序是面向对象的、严格类型化的并且完全可维护的。该库自动检测浏览器的功能并使用正确的方式呈现站点,从而避免浏览器错误。这里是an example of aplication using wt
另见 this thread。
您应该尝试创建一个 cgi 脚本,根据您的应用程序的需要,您应该使用 FastCGI(它不会在您每次调用时创建整个进程上下文)。
- CGI
您应该安装 Apache 服务器并激活 cgi 模块(通常默认激活)。 然后你可以开发一个c++程序,将可执行文件放入配置的CGI文件夹中,赋予正确的权限。这个 CGI 脚本应该进行某种进程间通信(它可以通过套接字或共享内存,第一个更容易)。 我希望您知道 CGI 脚本在 C/C++ + Apache 中是如何工作的,但它非常简单,总而言之,您会收到标准输入中的环境并将答案输入标准输出。
- FastCGI
你可以使用 apache,安装 fastcgi 模块并在你的程序中创建一个线程(它也可以在你的主循环中,但我不推荐)并将 apache 服务器 FastCGI 模块附加到你的守护进程。
最后但同样重要的是,您应该 运行 您的守护进程即服务。
PS : There are some framework options(like cppcms and wt), but since you already have the daemon written i thought it would be a pain in the ass to change everything (of course, it depends on a lot of things, like the complexity and size of your application).
我的小组只是将其作为一个 class 项目来做,我们主要使用 cpp-netlib as a network library, but we also used curlpp 来处理一些小事。我们将其托管在 Amazon EC2 实例上,设置为 windows 服务器,您可以自由地执行 UI 任何您真正想要的操作。这是一个相当简单的项目,但走这条路并没有我想象的那么局限。希望有帮助
为了在 Windows 和 IIS 6 上实现高性能,您需要创建一个 ISAPI dll; in IIS 7 you will want to create a module。两者都不是特别微不足道,你将不得不做大量的阅读。