まいど。いかおです
今や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]);
}
.
.
※本気でやりたい人がいますかね。。。。





