第84章 CGIプログラミング その5


今回は、環境変数を取得して、アクセスカウンターのログにいろいろなものを記録できるようにします。



さて、サーバーの環境変数はいろいろなものがあります。

環境変数意味
CONTENT_LENGTHフォームからの入力データのサイズ
SERVER_NAMEサーバーのホスト名
HTTP_HOSTホスト名
HTTP_REFERERリンク元URL
HTTP_USER_AGENTアクセス元のOS,ブラウザ情報
PATHパス情報
SCRIPT_NAMECGIプログラムのURL
REMOTE_ADDRユーザーのIPアドレス
REMOTE_HOSTユーザーのホスト名
HTTP_HOSTドメイン名

他にもまだたくさんあります。また、すべてのサーバーがこれらを完全にサポートしている訳でもありません。

さて、現在の環境からこれらの値を取得するにはgetenv関数を使います。

char *getenv( 
   const char *varname 
);
また、stdlib.hをインクルードする必要があります。 呼び出し側のSHTMLは、前章と同じです。

では、プログラムを見てみましょう。

// count03.c

#include <stdio.h>
#include <process.h>
#include <time.h>
#include <stdlib.h>

#define FILENAME "log/count.log"
#define LOGNAME "log/ac.log" //アクセスログ

int main()
{
	FILE *fp;
	int cnt, newcnt, i;
	time_t present_tm;
	struct tm *my_time;
	char *now_time;
	char *lpszBrowser, *lpszUserIP;

	lpszBrowser = getenv("HTTP_USER_AGENT");
	lpszUserIP = getenv("REMOTE_ADDR");

	time(&present_tm);
	my_time = localtime(&present_tm);
	now_time = asctime(my_time);

	fp = fopen(FILENAME, "r");
	if (fp == NULL) {
		printf("Error!");
		exit(-1);
	}
	fscanf(fp, "%d", &cnt);
	fclose(fp);

	newcnt = cnt + 1;

	fp = fopen(FILENAME, "w");
	if (fp == NULL) {
		printf("Error!");
		exit(-1);
	}
	fprintf(fp, "%d", newcnt);
	fclose(fp);

	fp = fopen(LOGNAME, "a");
	if (fp == NULL) {
		printf("error!");
		exit(-1);
	}
	i = (int)strlen(now_time);
	//asctimeでは、最後に改行とヌル文字が付加されるので改行を取り除く
	now_time[i - 1] = '\0';
	
	fprintf(fp, "%d,%s,%s,%s\n", cnt, now_time, lpszBrowser, lpszUserIP);
	fclose(fp);

	printf("No.%06d",cnt);

	return 0;
}
今回も簡単でしたね。

アクセスログは次のような感じになります。

1,Mon Nov 18 22:35:57 2002,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705),192.168.0.10
2,Mon Nov 18 22:35:58 2002,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705),192.168.0.10
3,Mon Nov 18 22:35:59 2002,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705),192.168.0.10
4,Mon Nov 18 22:36:00 2002,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705),192.168.0.10
5,Mon Nov 18 22:37:03 2002,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; .NET CLR 1.0.3705),192.168.0.10
6,Mon Nov 18 22:37:06 2002,Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Q312461; .NET CLR 1.0.3705),192.168.0.10
7,Mon Nov 18 22:37:47 2002,Mozilla/4.0 (compatible; MSIE 5.5; Windows 98),192.168.0.10
8,Mon Nov 18 22:37:51 2002,Mozilla/4.0 (compatible; MSIE 5.5; Windows 98),192.168.0.10
アクセス元のOSはWindowsXP,Windows2000, Windows98SEです。また、3台の異なる パソコンからアクセスしていますが、同一のプロクシを通しているのでREMOTE_ADDRの 値はすべて192.168.0.10となっています。                                                                                                
[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Nov/19/2002 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。