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