C 언어 CGI 프로그램 -- POST 폼 / GET 폼 처리
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 폼 을 보 여 줍 니 다.
注意: ../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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
apr_socket_recv: peer 오류 로 연결 재 설정처음에는 apache 서버 설정 에 문제 가 있다 고 생각 했 습 니 다. 인터넷 에서 찾 아 보 니 당신 도 알 고 있 었 습 니 다. 우리 나라 의 특수 한 국정 관례 에 따라 모두 같은 글 을 시험 해 보 았 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.