| hello.cgiのテスト,開発パッケージのダウンロードは,「ホームサーバ接続」のデモ・サーバで行って頂けます。通常,デモ・サーバは,午後11時(23時)頃から午前3時頃まで稼働します。 現在のデモ・サーバの稼働状態は, となっています。このインジケータが, | ||
| 緑色の「デモサーバ(demo.argus.ne.jp)は現在稼働中です。」となっている場合はテスト,ダウンロードをして頂けます。 | ||
| 黄色の「デモサーバ(demo.argus.ne.jp)は現在稼働していません。」となっている場合はテスト,ダウンロードは出来ません。 | ||
| hello.cgiのテスト (http://demo.argus.ne.jp/cgi-bin/hello.cgi) | ||
| hello.cgiパッケージのダウンロード (http://demo.argus.ne.jp/download/) | ||
#include <stdio.h>
void main(void)
{
puts("Content-type: text/plain");
puts("");
puts("HELLO!");
}
| 1行目 | "Content-type: text/plain"は,このデータの形式が単純テキストである事を知らせるヘッダです。 データ形式がHTMLテキストならば,"Content-type: text/html"となります。 JPEG画像ならば,"Content-type: image/jpeg"です。 つまり"Content-type:"の後に来るデータ形式文字列は,MIMEタイプとして定義されているものです。 |
| 2行目 | ヘッダとデータを区切りの空行で,絶対に必要です。これが無いと,HTTPサーバはエラーを起こす場合があります。 |
| 3行目 | このhello.cgiが送り出すテキストの"HELLO!"です。 |
| インターネットで一般的なもの | |
| text/plain | 単純なテキスト |
| text/html | HTMLテキスト |
| image/gif | GIF形式のイメージ |
| image/jpeg | JPEG/JFIF形式のイメージ |
| audio/aiff | AIFF形式の音声データ |
| audio/midi | MIDIシーケンス |
| またこの様なものもあります。^^; | |
| application/msexcel | MS-エクセルのスプレッドシート |
| application/msword | MS-ワードのドキュメント |

| エンコードされた文字 | 元の文字,意味 |
| & | 各データのセパレータ |
| = | データラベルとデータのセパレータ |
| + | 空白 |
| % | 引き続く2文字が16進文字コード |
| 文字コードセット | "QUERY_STRING"の内容 |
| シフトJIS | Name=%83A%81%5B%83K%83X%83l%83b%83g&Category=%83f%83%82 |
| JIS | Name=%1B%24B%25%22%21%3C%25%2C%259%25M%25C%25H%1B%28B&Category=%1B%24B%25G%25b%1B%28B |
| EUC | Name=%A5%A2%A1%BC%A5%AC%A5%B9%A5%CD%A5%C3%A5%C8&Category=%A5%C7%A5%E2 |
int ProcessQueryString(char *s)
{
char *pd;
int ch,n;
pd = s; n = 0;
while(*s) {
switch(*s) {
case '&': //データのセパレータ
*pd++ = '\0';
s++;
n++;
break;
case '+': //空白
*pd++ = ' ';
s++;
break;
case '%': //文字コードエスケープ
sscanf(s + 1,"%02x",&ch);
*pd++ = (char)ch;
s += 3;
break;
default: //7ビットASCII文字
*pd++ = *s++;
break;
}
}
*pd++ = '\0'; *pd++ = '\0';
return n;
}
| greeting.cgiのテスト,開発パッケージのダウンロードは,「ホームサーバ接続」のデモ・サーバで行って頂けます。通常,デモ・サーバは,午後11時(23時)頃から午前3時頃まで稼働します。 現在のデモ・サーバの稼働状態は, となっています。このインジケータが, | ||
| 緑色の「デモサーバ(demo.argus.ne.jp)は現在稼働中です。」となっている場合はテスト,ダウンロードをして頂けます。 | ||
| 黄色の「デモサーバ(demo.argus.ne.jp)は現在稼働していません。」となっている場合はテスト,ダウンロードは出来ません。 | ||
| greeting.cgiのテスト (http://demo.argus.ne.jp/greeting.html) | ||
| greeting.cgiパッケージのダウンロード (http://demo.argus.ne.jp/download/) | ||
void main(void)
{
char QueryString[1024],Name[1024],Email[1024],RemoteHost[1024];
char *p,*pData,*pLabel;
int len,error;
error = 0;
//環境変数"QUERY_STRING"を取得,バッファにコピー
p = getenv("QUERY_STRING");
strncpy(QueryString,p,sizeof(QueryString) - 1);
QueryString[sizeof(QueryString) - 1] = '\0';
//"QUERY_STRING"のデコードと切り分け
ProcessQueryString(QueryString);
//"QUERY_STRING"から目的のデータを取り出す
pData = QueryString;
while(*pData) {
//「お名前」,データ名は"Name"
pLabel = "Name="; len = strlen(pLabel);
if(strncmp(pData,pLabel,len) == 0) {
if(strlen(pData + len) != 0)
strcpy(Name,pData + len);
else error += 1;
}
//「メイルアドレス」,データ名は"Email"
pLabel = "Email="; len = strlen(pLabel);
if(strncmp(pData,pLabel,len) == 0) {
if(strlen(pData + len) != 0)
strcpy(Email,pData + len);
else error += 2;
}
//セパレータ(='\0')を探す
while(*pData) pData++;
//次のデータの先頭へ
pData++;
}
//環境変数"REMOTE_HOST"はクライアントのホスト名またはIPアドレスを示している
p = getenv("REMOTE_HOST");
if(p != NULL) strcpy(RemoteHost,p);
else strcpy(RemoteHost,"多分インターネット");
if(error == 0) { //エラーなし,HTML出力開始
puts("Content-type: text/html");
puts("");
puts("<HTML>");
puts("<HEAD>");
puts("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=Shift_JIS\">");
puts("<TITLE>PWS用CGIプログラム,\"greeting\"からのご挨拶</TITLE>");
puts("</HEAD>");
puts("<BODY><CENTER>");
puts("<H1>PWS用CGIプログラム,\"greeting\"からのご挨拶</H1></CENTER><BR><BR>");
puts("<B><FONT COLOR=#0000FF>");
puts(RemoteHost);
puts("</FONT></B>からお越しの<B><FONT COLOR=#0000FF>");
puts(Name);
puts("</FONT></B>さんですね,<BR><BR>");
puts("PWS用CGIプログラム,\"greeting\"がご挨拶を申し上げます。<BR><BR>");
puts("ようこそ,ようこそいらっしゃいました。<BR><BR>");
puts("<B><FONT COLOR=#0000FF>");
puts(Name);
puts("</FONT></B>さんのメイルアドレスは<B><FONT COLOR=#0000FF>");
puts(Email);
puts("</FONT></B>と承っております。<BR><BR>");
puts("<HR><BR>");
puts("<ADDRESS>Copyright(c) ARGUS NET<BR>All rights reserved.<BR></CENTER></ADDRESS><BR>");
puts("</BODY></HTML>");
}
else { //エラー,HTML出力開始
puts("Content-type: text/html");
puts("");
puts("<HTML>");
puts("<HEAD>");
puts("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=Shift_JIS\">");
puts("<TITLE>PWS用CGIプログラム,\"greeting\"</TITLE>");
puts("</HEAD>");
puts("<BODY><CENTER>");
puts("<H1>PWS用CGIプログラム,\"greeting\"は悲しく思います。</H1><BR><BR>");
if(error & 1) printf("お名前");
if(error & 2) {
if(error != 2) printf(",そして");
printf("メイルアドレス");
}
puts("が未入力です。<BR><BR>");
puts("今回はご挨拶は致しません。<BR><BR>");
puts("<HR><BR>");
puts("<CENTER><ADDRESS>Copyright(c) ARGUS NET<BR>All rights reserved.<BR></CENTER></ADDRESS><BR>");
puts("</BODY></HTML>");
}
}
6.CGIプログラムが受け取る環境変数| dumpenv.cgiのテスト,開発パッケージのダウンロードは,「ホームサーバ接続」のデモ・サーバで行って頂けます。通常,デモ・サーバは,午後11時(23時)頃から午前3時頃まで稼働します。 現在のデモ・サーバの稼働状態は, となっています。このインジケータが, | ||
| 緑色の「デモサーバ(demo.argus.ne.jp)は現在稼働中です。」となっている場合はテスト,ダウンロードをして頂けます。 | ||
| 黄色の「デモサーバ(demo.argus.ne.jp)は現在稼働していません。」となっている場合はテスト,ダウンロードは出来ません。 | ||
| dumpenv.cgiのテスト (http://demo.argus.ne.jp/cgi-bin/dumpenv.cgi) | ||
| dumpenv.cgiパッケージのダウンロード (http://demo.argus.ne.jp/download/) | ||
char *p,*method,*param;
int len,n,done;
done = FALSE; //コードの最後でdoneがTRUEになっていれば正常にパラメータを取得出来た
method = getenv("REQUEST_METHOD"); //"REQUEST_METHOD"を取る
if(method != NULL) { //"REQUEST_METHOD"が取れた
if(stricmp(method,"POST") == 0) { //POSTメソッド
p = getenv("CONTENT_LENGTH"); //"CONTENT_LENGTH"を取る
if(p != NULL) { //"CONTENT_LENGTH"が取れた
len = atoi(p); //"CONTENT_LENGTH"を数値に変換
param = calloc(1,len + 1); //パラメータバッファを用意
if(param != NULL) { //パラメータバッファが確保出来たら
n = fread(param,1,len,stdin); //fread()で一気に読み込む
if(n == len) done = TRUE; //正常に終了
}
}
}
}
char *p,*method,*param;
int len,n,done;
done = FALSE; //コードの最後でdoneがTRUEになっていれば正常にパラメータを取得出来た
method = param = NULL; //後でメモリを解放するための初期化
method = getenv("REQUEST_METHOD"); //"REQUEST_METHOD"を取る
if(method != NULL) { //"REQUEST_METHOD"が取れた
if(stricmp(method,"POST") == 0) { //POSTメソッド
p = getenv("CONTENT_LENGTH"); //"CONTENT_LENGTH"を取る
if(p != NULL) { //"CONTENT_LENGTH"が取れた
len = atoi(p); //"CONTENT_LENGTH"を数値に変換
param = calloc(1,len + 1); //パラメータバッファを用意
if(param != NULL) { //パラメータバッファが確保出来たら
n = fread(param,1,len,stdin); //fread()で一気に読み込む
if(n == len) done = TRUE; //正常に終了
}
}
}
else if(stricmp(method,"GET") == 0) { //GETメソッド
p = getenv("QUERY_STRING"); //"QUERY_STRING"を取る
if(p != NULL) { //"QUERY_STRING"が取れた
param = strdup(p); //getenv()は揮発性の文字列を返して来るので,strdup()でコピー
if(param != NULL) done = TRUE; //正常に終了
}
else { //メソッドがPOSTでもGETでも無い
//何もしない
}
}
//この時点でdoneがTRUEで無ければ,何かのエラー処理を行う
|
|
| demostat.cgiのテスト,開発パッケージのダウンロードは,「ホームサーバ接続」のデモ・サーバで行って頂けます。通常,デモ・サーバは,午後11時(23時)頃から午前3時頃まで稼働します。 現在のデモ・サーバの稼働状態は, となっています。このインジケータが, | ||
| 緑色の「デモサーバ(demo.argus.ne.jp)は現在稼働中です。」となっている場合はテスト,ダウンロードをして頂けます。 | ||
| 黄色の「デモサーバ(demo.argus.ne.jp)は現在稼働していません。」となっている場合はテスト,ダウンロードは出来ません。 | ||
| demostat.cgiのテスト (http://demo.argus.ne.jp/cgi-bin/demostat/demostat.cgi) | ||
| demostat.cgiパッケージのダウンロード (http://demo.argus.ne.jp/download/) | ||
| ストリームファイルアクセスの場合 | fp = fopen(filename,"rb"); |
| 低水準ファイルアクセスの場合 | fd = open(filename,O_RDONLY | O_BINARY); |