まいど。いかおです
今やraspberry piなんかでperlが使えるご時世にあえてC言語でCGIの例を・・・
・ヘッダーの情報はgetenv()で取得できる
・FORMの情報はPOSTならstdinからCONTENT_LENGTH分読み込んだもの、GETならヘッダ情報のQUERY_STRINGの内容である
・responceは基本的にstdoutへ書き出す
ヘッダ情報の取り出し例
/* Enviroment element */
const char      *c_list[] = {"SERVER_SOFTWARE", "SERVER_NAME", "GATEWAY_INTERFACE", "SERVER_PROTOCOL",
                        "SERVER_PORT", "REQUEST_METHOD", "PATH_INFO", "PATH_TARNSRATED", "SCRIPT_NAME",
                        "QUERY_STRING", "REMOTE_HOST", "REMOTE_ADDR", "AUTH_TYPE", "REMOTE_USER",
                        "REMOTE_IDENT", "CONTENT_TYPE", "CONTENT_LENGTH", "HTTP_ACCEPT", "HTTP_USER_AGENT", ""};
 for (i=0;c_list[i][0] != 0x00;i++) {
    if ((p=getenv (c_list[i])) != NULL) {
         p; // これをなんとかする
    }
}
FORM情報の取得(POST)
#define MAX_PARALEN 4096
char    buff[MAX_PARALEN]
memset (buff, 0x00, MAX_PARALEN);
int pos=0;
int remain=length;
while (remain > 0) {
    if ((len=fread (&(buff[pos]), 1, remain, stdin)) > 0) {
        remain = remain - len;
        pos = pos + len;
    }
}
ここで取得したbuffを'&'でセパレートしてやれば
name=valueが取り出せます
pos=0; pcnt=0;
for (i=0;i < length ;i++) {
    if (buff[i]=='&') {
       // ここがname=valueの先頭アドレス
        &(buff[pos]);
        // ここがname=valueの長さ
        (i - pos));
    }
}
responceの例
printf()とかでstdoutに吐き出していきます
static  const   char    *index_html[] = {"<!DOCTYPE html>\n",
                                                           "<html>\n",
                                                           "<body>\n",
                                                           "<h1>Hello world</h1>\n",
                                                           "</body>\n",
                                                           "</html>\n",
                                                           ""
};
.
.
for(int i=0;index_html[i] != "";i++){
    printf(index_html[i]);
}
.
.
※本気でやりたい人がいますかね。。。。






