c ++ {#mainpage}中的FastCGI实现
dmitigr:: fcgi是用C ++编写的FASTCGI协议实现。
你好世界
fcgi .hpp>
#include <iostream>
int main()
{
namespace fcgi = dmitigr:: fcgi ;
try {
const auto port = 9000;
const auto backlog = 64;
fcgi ::Listener server{ fcgi ::Listener_options{"0.0.0.0", port, backlog}};
server.listen();
while (true) {
if (const auto conn = server.accept()) {
conn->out() << "Content-Type: text/plain" << fcgi ::crlfcrlf;
conn->out() << "Hello from dmitigr:: fcgi !";
}
}
} catch (const std::exception& e) {
std::cerr << "Oops: " << e.what() << std::endl;
return 1;
}
}\”>
# include < dmitigr/ fcgi / fcgi .hpp > # include < iostream > int main () { namespace fcgi = dmitigr:: fcgi ; try { const auto port = 9000 ; const auto backlog = 64 ; fcgi ::Listener server{ fcgi ::Listener_options{ \" 0.0.0.0 \" , port, backlog}}; server. listen (); while ( true ) { if ( const auto conn = server. accept ()) { conn-> out () << \" Content-Type: text/plain \" << fcgi ::crlfcrlf; conn-> out () << \" Hello from dmitigr:: fcgi ! \" ; } } } catch ( const std::exception& e) { std::cerr << \" Oops: \" << e. what () << std::endl; return 1 ; } }
您好,多线程世界
fcgi .hpp>
#include <iostream>
#include <thread>
#include <vector>
namespace {
constexpr std::size_t pool_size{64};
} // namespace
int main()
{
namespace fcgi = dmitigr:: fcgi ;
try {
const auto serve = [](auto* const server)
{
while (true) {
const auto conn = server->accept();
conn->out() << "Content-Type: text/plain" << fcgi ::crlfcrlf;
conn->out() << "Hello from dmitigr:: fcgi !";
conn->close(); // Optional.
}
};
const auto port = 9000;
const auto backlog = 64;
std::clog << "Multi-threaded FastCGI server started:\\n"
<< " port = " << port << "\\n"
<< " backlog = " << backlog << "\\n"
<< " thread pool size = " << pool_size << std::endl;
fcgi ::Listener server{ fcgi ::Listener_options{"0.0.0.0", port, backlog}};
server.listen();
std::vector<std::thread> threads(pool_size);
for (auto& t : threads)
t = std::thread{serve, &server};
for (auto& t : threads)
t.join();
server.close(); // Optional.
} catch (const std::exception& e) {
std::cerr << "error: " << e.what() << std::endl;
return 1;
}
}\”>
# include < dmitigr/ fcgi / fcgi .hpp > # include < iostream > # include < thread > # include < vector > namespace { constexpr std:: size_t pool_size{ 64 }; } // namespace int main () { namespace fcgi = dmitigr:: fcgi ; try { const auto serve = []( auto * const server) { while ( true ) { const auto conn = server-> accept (); conn-> out () << \" Content-Type: text/plain \" << fcgi ::crlfcrlf; conn-> out () << \" Hello from dmitigr:: fcgi ! \" ; conn-> close (); // Optional. } }; const auto port = 9000 ; const auto backlog = 64 ; std::clog << \" Multi-threaded FastCGI server started: \\n \" << \" port = \" << port << \" \\n \" << \" backlog = \" << backlog << \" \\n \" << \" thread pool size = \" << pool_size << std::endl; fcgi ::Listener server{ fcgi ::Listener_options{ \" 0.0.0.0 \" , port, backlog}}; server. listen (); std::vector<std::thread> threads (pool_size); for ( auto & t : threads) t = std::thread{serve, &server}; for ( auto & t : threads) t. join (); server. close (); // Optional. } catch ( const std::exception& e) { std::cerr << \" error: \" << e. what () << std::endl; return 1 ; } }
用法
快速用作仅标题库
将src目录的内容复制到一个项目目录,该目录包括编译器的路径,例如src/3rdparty/dmitigr 。
创建hello.cpp :
fcgi .hpp"
int main()
{
// Application code here…
}\”>
# include \" dmitigr/ fcgi / fcgi .hpp \" int main () { // Application code here... }
编译hello.cpp :
g++ -std=c++17 -ohello hello.cpp
用cmake快速使用
创建构建目录,配置,构建和安装:
fcgi
mkdir build && cd build
cmake ..
cmake –build .
sudo cmake –install .\”>
cd fcgi
mkdir build && cd build
cmake ..
cmake --build .
sudo cmake --install .
创建hello/hello.cpp :
fcgi .hpp"
int main()
{
// Application code here…
}\”>
# include \" dmitigr/ fcgi / fcgi .hpp \" int main () { // Application code here... }
创建hello/CMakeLists.txt :
fcgi)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(hello hello.cpp)
target_link_libraries(hello dmitigr_ fcgi )\”>
cmake_minimum_required ( VERSION 3.16 ) project ( foo ) find_package ( dmitigr_cpplipa REQUIRED COMPONENTS fcgi ) set ( CMAKE_CXX_STANDARD 17 ) set ( CMAKE_CXX_STANDARD_REQUIRED ON ) add_executable ( hello hello.cpp ) target_link_libraries ( hello dmitigr_ fcgi )
编译hello/hello.cpp :
mkdir hello/build && cd hello/build
cmake ..
cmake --build .
高级用法
有关更多详细信息,请参阅使用部分,以获取如何链接dmitigr:: fcgi提示。
