c++のCGIを試したくなったので簡易Webサイトを作ってみる

はじめに

こんにちは、野村です。

cやc++で作ったCGIって、やっぱ高速なのかな?
でも、手間がかかるはず。実用に見合うのだろか?

そんな疑問がわいたので、とりあえず挑戦してみたのですよ。

クエリからファイル名を取得し、そのファイルの内容を定位置に吐き出す仕組みです。

作ってみると結構めんどくさかった。
速度については確かに速い気がした。でも、この程度のCGIではなんとも言えないな。

ソースファイル

index.cgi

index.cppという名前で以下のファイルを作成し、サーバにアップしてからビルドします。
某無料レンタルサーバで試したところ、無事ビルドできました。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <fstream>

using namespace std;

string Replace(string str1, string str2, string str3){
  string::size_type Pos(str1.find(str2));
  while(Pos != string::npos){
    str1.replace( Pos, str2.length(), str3);
    Pos = str1.find(str2, Pos + str3.length() );
  }
  return str1;
}

int main(void){
  const char* head = "./head.txt";
  const char* foot = "./foot.txt";
  char *s_dt;
  string txt = "./txt/", buf, ttl;
  
  s_dt = getenv("QUERY_STRING");
  if(!strcmp(s_dt, "")){
    txt = txt + "0000";
  }else{
    string str(s_dt);
    txt = txt + Replace(str, "/", "");
  }

  ifstream ift(txt.data());
  getline(ift, ttl);
  ttl = Replace(ttl, "<h2>", "");
  ttl = Replace(ttl, "</h2>", "");

  cout << "Content-type: text/html; charset=utf-8\n" << endl;

  ifstream ifs(head);
  while(ifs && getline(ifs, buf)){
    if (-1 < (int)buf.find("<title>")){
      printf(buf.data(), ttl.data());
      cout << endl;
    }else{
      cout << buf << endl;
    }
  }

  ifstream ifc(txt.data());
  while(ifc && getline(ifc, buf)){
    cout << buf << endl;
  }

  ifstream ife(foot);
  while(ife && getline(ife, buf)){
    cout << buf << endl;
  }

  return 0;
}

ビルドのコマンド

$ g++ index.cpp -o index.cgi

head.txt

全ページ共通のヘッダ部です。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<title>%s - cgitest</title>
</head>
<body>
<center><h1><a href="./">cgitest</a></h1></center>
<hr/>

foot.txt

全ページ共通のフッタ部です。

<hr/>
<center><small>(c) 2017</small></center>
</body>
</html>

txt/0000

トップページです。
必ず一行目に<h2>タグでタイトルを記入します。

<h2>index</h2>
<ul>
<li><a href="./?0001">0001</a></li>
<li><a href="./?0002">0002</a></li>
</ul>

txt/0001

1ページ目です。
必ず一行目に<h2>タグでタイトルを記入します。

<h2>1ページ目</h2>
<p>
1ページ目の記事<br/>
</p>

txt/0002

2ページ目です。
必ず一行目に<h2>タグでタイトルを記入します。

<h2>2ページ目</h2>
<p>
2ページ目の記事<br/>
</p>

最後に

以上、c++で簡易Webサイトを作ってみました。

次にc++のCGIに挑戦するなら、SQLiteを使った掲示板あたりにしようかな?

というわけで、今回はこれにて。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

野村 野村のプロフィール
メインPCはWindows10のVirtualBox上のFreeBSD。Linux/Unixの小ネタを求めて日々右往左往してたりする。