C 언어 CGI 프로그램 -- POST 폼 / GET 폼 처리

5295 단어 WEB
http://blog.163.com/pirates_fish/blog/static/1833331502011423111941498/
POST 폼 에서 CGI 프로그램 까지 데 이 터 를 수집 하 는 방법 을 살 펴 보 자. 다음은 비교적 간단 한 C 소스 코드 를 제시 했다.     
#include 
#include 
#define MAXLEN 80
#define EXTRA 5
/*   4      "data",   1     "="   */
#define MAXINPUT MAXLEN+EXTRA+2
/*   1        ,         NULL   */
#define DATAFILE "../data/data.txt"
/*               */
void unencode(char *src, char *last, char *dest)
{
 for(; src != last; src++, dest++)
   if(*src == '+')
     *dest = ' ';
   else if(*src == '%') {
     int code;
     if(sscanf(src+1, "%2x", &code) != 1) code = '?';
     *dest = code;
     src +=2; }     
   else
     *dest = *src;
 *dest = '
'; *++dest = '\0'; } int main(void) { char *lenstr; char input[MAXINPUT], data[MAXINPUT]; long len; printf("%s%c%c
", "Content-Type:text/html;charset=GB2312",13,10); printf("Response
"); lenstr = getenv("CONTENT_LENGTH"); if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len > MAXLEN) printf("

."); else { FILE *f; fgets(input, len+1, stdin); unencode(input+EXTRA, input+len, data); f = fopen(DATAFILE, "a"); if(f == NULL) printf("

, , ."); else fputs(data, f); fclose(f); printf("

, !
%s",data); } return 0; }

      본질 적 으로 프로그램 은 CONTENTLENGTH 환경 변수 에서 데이터 의 길 이 를 얻 은 다음 해당 길이 의 문자열 을 읽 습 니 다.데이터 내용 은 전송 과정 에서 인 코딩 을 거 쳤 기 때문에 해당 하 는 디 코딩 을 해 야 합 니 다.인 코딩 의 규칙 은 매우 간단 하 다. 주로 이 몇 가지 가 있다.     
1.   폼 의 각 필드 는 필드 이름 의 뒷 굽 등 호 를 사용 하고 이 필드 의 값 을 연결 하여 각 필드 간 의 내용 을 & 연결 합 니 다.
2.   모든 빈 칸 기 호 는 플러스 로 대체 되 기 때문에 인 코딩 코드 세그먼트 에 빈 칸 이 나타 나 는 것 은 불법 입 니 다.             3.   특수 한 문자, 예 를 들 어 구두점 기호 와 특정한 의 미 를 가 진 문자, 예 를 들 어 '+' 는 백분 번호 뒤에 해당 하 는 ACSII 코드 값 으로 표시 합 니 다.     
예 를 들 어 사용자 가 입력 한 것 이:                       Hello   there!      그러면 데이터 가 서버 로 전 송 될 때 인 코딩 을 통 해 data = Hello + there% 21 이 됩 니 다.  위의 unencode () 함 수 는 인 코딩 된 데 이 터 를 디 코딩 하 는 데 사 용 됩 니 다.디 코딩 이 끝 난 후 데 이 터 는 data. txt 파일 의 끝 에 추가 되 어 탐색 중 에 나타 납 니 다.      파일 을 컴 파일 한 후 mult. cgi 로 이름 을 바 꾸 고 CGI 디 렉 터 리 에 두 면 폼 에 호출 될 수 있 습 니 다.
gcc -o mult.cgi mult.c
다음은 html 폼 을 보 여 줍 니 다.     
请输入您的留言(最多80个字符 ):

   


注意:  ../data/data.txt的文件应该提前建立,而且文件属性应该为666.

chmod 666 ../data/data.txt    
    
       事实上,这个程序只能作为例子,是不能够正式的使用的。它漏掉了很关键的一个问题:当有多个用户同时像文件写入数据是,肯定会有错误发生。而对于一个这样的程序而言,文件被同时写入的几率是很大的。因此,在比较正式的留言版程序中,都需要做一些更多的考虑,比如加入一个信号量,或者是借助于一个钥匙文件等。因为那只是编程的技巧问题,在这儿就不多说了。

下面是仅查看文件../data/data.txt的C源代码:

#include 
#include 
#define DATAFILE "../data/data.txt"
int main(void)
{
FILE *f = fopen(DATAFILE,"r");
int ch;
if(f == NULL) {
  printf("%s%c%c
", "Content-Type:text/html;charset=iso-8859-1",13,10); printf("Failure
"); printf("

Unable to open data file, sorry!"); } else { printf("%s%c%c
", "Content-Type:text/plain;charset=iso-8859-1",13,10); while((ch=getc(f)) != EOF) putchar(ch); fclose(f); } return 0; } html :

-----------------------------------------------
 :get      m   n   。
#include 
#include 
main()
{
char *qa;
int m1,n1;
printf("%s%c%c
","Content-Type:text/html;charset=GB2312",13,10); printf("
"); qa = getenv ("QUERY_STRING"); sscanf(qa,"m=%d&n=%d",&m1,&n1); printf("%d,%d",m1,n1); return 0; }
 2:post      m   n   。
#include 
#include 
#define MAXLEN 80
#define EXTRA 5
/*   4      "data",   1     "="   */
#define MAXINPUT MAXLEN+EXTRA+2
/*   1        ,         NULL   */
//#define DATAFILE "./haha.sh"
/*               */
int main(void)
{
long len;
char *lenstr,poststr[20];
char m[10],n[10];
printf("%s%c%c
","Content-Type:text/html;charset=GB2312",13,10); printf(" cgi
"); lenstr = getenv("CONTENT_LENGTH"); //if(lenstr == NULL || len > MAXLEN) if(lenstr == NULL)   printf("

."); else{ len = atoi(lenstr); fgets(poststr,len+1,stdin); if (sscanf(poststr,"m=%[^&]&n=%s",m,n)!=1) {printf("m=%s,n=%s
",m,n);} printf("");} return 0; }

좋은 웹페이지 즐겨찾기