본문 바로가기
Server | Network

예전의 CGI 방식의 서버 프로그램 C 예제소스

by 두루물 2011. 1. 27.
지금이야 JSP,ASP,PHP,파이션 및 기타 여러가지 서버 프로그래밍 방식의 플랫폼이 주어져서 작업이 편했지만,
(물론 모두다 C에서 야기된 산출물 이지만) 아무것도 없던 예전엔 Low Level에서 모두 프로그래밍 해줬던 것이 기억난다.
여기저기 뒤적거리다 예전 자료를 발견해서 올려봄..


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/timeb.h>

#define LIST "phoneres.html"
#define MAX_ENTRIES 10000

typedef struct {
    char *f_name;
    char *f_val;
} entry;
int searchok=0;
char searchdata[100];
char *queryresult;
main(argc, argv)
int argc; char *argv[];
{
    register int i;
    int totn, cl;
    long cntn;
    char *whdomain, *whip, whtime[20], whdate[20], *browser;
    entry inparam[MAX_ENTRIES];
    time_t tmp_time1;
    struct tm *tmp_time2;
    FILE *fp;

    printf("Content-type: text/html%c%c",10,10);

    whdomain = getenv("REMOTE_HOST"); /*클라이언트 호스트명*/
    whip     = getenv("REMOTE_ADDR"); /*클라이언트 ip*/
    browser  = getenv("HTTP_USER_AGENT");/*클라이언트 브라우져명*/

    tmp_time1 = time(0);
    tmp_time2 = localtime(&tmp_time1);
    strftime(whdate, 99, "%Y/%m/%d", tmp_time2);
    strftime(whtime, 99, "%H:%M", tmp_time2);

    cl = atoi(getenv("CONTENT_LENGTH"));/*표준입력의 바이트수*/
    for(i=0;cl && (!feof(stdin));i++)
    {
        inparam[i].f_val = (char *)fmakeword(stdin,'&',&cl); /*입력필드분리*/
        plustospace(inparam[i].f_val);/*+ => space*/
        unescape_url(inparam[i].f_val);/*%다음의 16진수 2문자를 문자로 변환*/
        inparam[i].f_name = (char *)makeword(inparam[i].f_val,'=');/*변수분리*/
    }

        printf("Parameter Number=%d",i);
    if (strlen(inparam[0].f_val) <= 0)
    {
       printf("<BODY BGCOLOR=\"#000000\" TEXT=\"#ffffff\" LINK=\"#FFFF66\"
                 VLINK=\"#FF0099\" ALINK=\"#FF00FF\">%c", 10);

        printf("<H2>Sorry</H2>%c", 10);
        printf("조회키(이름)를 입력하세요.<BR>%c", 10);
        printf("<A HREF=\"phoneset.html\">입력화면으로..</A>%c", 10);
        printf("</BODY>");
        fclose(fp);
        exit(0);
    }

    if (atoi(inparam[1].f_val) !=0)/*조회가 아니면*/
    {
       printf("<BODY BGCOLOR=\"#000000\" TEXT=\"#ffffff\" LINK=\"#FFFF66\"
                 VLINK=\"#FF0099\" ALINK=\"#FF00FF\">%c", 10);

        printf("<H2>Sorry</H2>%c", 10);
        printf("조회만 가능합니다.<BR>%c", 10);
        printf("<A HREF=\"phoneset.html\">입력화면으로..</A>%c", 10);
        printf("</BODY>");
        fclose(fp);
        exit(0);
    }

    /*[start]---------------------------------------*/
    /*이부분에 db access루틴 추가함--krkim*/
    if(!stricmp(inparam[0].f_val,"김경래"))
    	searchok=1;
    if(searchok==1)
    strcpy(searchdata,"015-455-0813");
            
    
    /*[end]---------------------------------------*/
    if(searchok==0)
    {
       printf("<BODY BGCOLOR=\"#000000\" TEXT=\"#ffffff\" LINK=\"#FFFF66\"
                 VLINK=\"#FF0099\" ALINK=\"#FF00FF\">%c", 10);
       printf("<H2>Sorry</H2>%c", 10);
       printf("찾는 데이타가 없습니다.<BR>%c", 10);
       printf("<A HREF=\"phoneset.html\">입력화면으로..</A>%c", 10);
       printf("</BODY>");
       fclose(fp);
       exit(0);
    }
    
    fp = fopen(LIST, "w+");
    cntn = ftell(fp);
    fseek(fp, (long) (cntn+2), 0);
    fscanf(fp, "%d", &totn);
    fseek(fp, 0, 0);
    fprintf(fp, "<!%8d>%c", totn+1, 10);
    fseek(fp, 0, 2);

  
    fprintf(fp, " <HTML><HEAD><TITLE>결과화면</TITLE></HEAD>");
    fprintf(fp, " <BODY BGCOLOR=\"#000000\" TEXT=\"#ffffff\" LINK=\"#FFFF66\" VLINK=\"#000099\">");
    fprintf(fp, " <H2>결과화면:Messages from Outerspace</H2> %c",10);
    fprintf(fp, "<IMG WIDTH=100%% SRC=\"sha_ln4.jpg\">%c", 10);
    fprintf(fp, "%c<IMG SRC=\"green.gif\">조회결과입니다.%c<P>", 10, 10);
        /*fprintf(fp, "<FONT SIZE=+1><STRONG>%s</STRONG></FONT>", inparam[0].f_val);*/

    fprintf(fp, "<BLOCKQUOTE><TABLE WIDTH=600 BORDER=3>%c", 10);
    fprintf(fp, "<TR><TD><CITE>QueryKey(Name): </CITE><STRONG>%s</STRONG></TD></TR>%c", inparam[0].f_val, 10);
    fprintf(fp, "<TR><TD><CITE>Query Result  : </CITE><STRONG>%s</STRONG></TD></TR>%c", searchdata, 10);
    fprintf(fp, "</TABLE></BLOCKQUOTE>%c",10);
    
    fprintf(fp, "<BLOCKQUOTE><TABLE WIDTH=600 BORDER=2><TR>%c", 10);
    fprintf(fp, "<TD><CITE>Date : </CITE><STRONG>%s</STRONG></TD>%c", whdate, 10);

    if (whdomain == NULL) {
        fprintf(fp, "<TD><CITE>From : </CITE><STRONG>%s</STRONG></TD></TR>%c", whip, 10); }
    else {
        fprintf(fp, "<TD><CITE>From : </CITE><STRONG>%s (%s)</STRONG></TD></TR>%c", whdomain, whip, 10); }

    fprintf(fp, "<TR><TD><CITE>Time : </CITE><STRONG>%s</STRONG></TD>%c", whtime, 10);
    fprintf(fp, "<TD><CITE>With : </CITE><STRONG>%s</STRONG></TD></TR></TABLE></BLOCKQUOTE>%c", browser, 10);

    
    fprintf(fp, "<IMG WIDTH=100%% SRC=\"sha_ln4.jpg\">%c", 10);
    fclose(fp);

    printf("<BODY BGCOLOR=\"#000000\" TEXT=\"#ffffff\" LINK=\"#FFFF66\" VLINK=\"#000099\" ALINK=\"#0000FF\">%c", 10);
    printf("<FONT SIZE=+3><CITE>Thank you.</CITE></FONT><P>%c", 10);
    printf("처리완료:<A HREF=\"phoneres.html\"> 결과보기</A><BR>%c", 10);
	printf("<A HREF=\"phoneset.html\">입력화면으로..</A>%c", 10);
    printf("</BODY>");
}