2008. 10. 12. 19:50

POST 방식 쿼리전송, C언어로 처리하기

(1)
POST 방식은 마치 키보드로 입력하는 것과 동일한 방법으로 데이터를 전달하기 때문에,
이를 전송 받을 프로그램에서는 몇 글자나 전송될 지 그 길이를 알아야 입력 받을 수 있다.

querylen=atoi(getenv("CONTENT_LENGTH"));

*만약 데이터량이 대단히 큰 경우라면 atol()를 사용한다.

(2)
POST 방식은 키보드 입력을 통해 데이터를 전달하기 때문에, 키보드 입력용 함수들을 모두 사용할 수 있다. 즉, scanf()를 직접 사용할 수 있는데, 이 함수는 공백 문자나  탭 문자, 엔터 문자 등에 의해 입력이 중단되므로, 어떤 문자라도 입력받을 수 있는 함수가 필요하다. 대표적으로 getchar()함수,
이는 키보드로부터 전달되는 어떤 글자라도( 엔터,커서 이동용 화살표, 특수 function키까지도 ) 한 글자씩 읽어 들인다.


(3)쿼리의 복원
CGI 규약에 의해 변환된 문자는 다음과 처리 분류 될수 있다.

'+'자         -> 공백 문자로 교체
'&'자        -> 필드의 끝
'%'로시작 -> 다음 2글자를 읽어 10진수로 변환
나머지     -> 그대로

- 코드 작성 : 한글자를 읽은 후 swtich()문으로 분류하고 결과를 반환

ip=getchar();
switch(ip)
{
 case '+' : ip=' ';
     break;

 case '&' : ip=0;  // NULL 문자를 대입  ( 아스키값 0 = NULL )
     break;

 case '%' : 다음 두글자를 읽어 10진수로 변환해야함;
     break;

 default  :
     break;
}


16진 변환부분 코드
//ip 16진수의 첫째자리수 , ip2 둘째자리수

case '%' : ip2=toupper(getchar());  // 대문자로 변환
                if( ip2 < 'A')                 //  A보다 작으면 -> 0~9의 숫자라면
                      ip=ip2-'0';             // 0의 아스키값을 빼고나면 ip의 숫자가 10진수로 남음
                else                          // A-Z 라면
                      ip=ip2-'A'+10;    // A의 아스키값을 빼고 10을 더하면 10진수로 변환
                                             // (16진수 A는 10에 해당되기때문)

                ip=ip*16;                // 16진수의 첫번째 자리이기때문에 *16을 해준다
                ip2=toupper(getchar());  // 나머지는 위와같다
                if(ip2<'A')
                       ip=ip+ip2-'0';
                else
                       ip=ip+ip2-'A'+10;
                break;



출처 : CGI로 C-언어 정복 , 이현창.이종언 공저 , 도서출판 상학당