CGI TipsCGI ÇÁ·Î±×·¡¹ÖÀ» ÀÛ¼ºÇÏ´Ùº¸¸é ¾Æ·¡¿Í °°Àº ¿¡·¯¸Þ½ÃÁö¸¦ ÀÚÁÖ Á¢ÇÏ°Ô µÈ´Ù. ÀϹÝÀûÀ¸·Î UNIX¿¡¼ C ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ù º¸¸é °Þ°Ô µÇ´Â "Segmentation fault"¿¡·¯°¡ ÀÌ·¯ÇÑ ½ÄÀ¸·Î Ç¥ÇöµÇ±â ¶§¹®ÀÌ´Ù.
500 Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, armian@stissbs.kordic.re.kr and inform them of the time the error occurred, and anything you might have done that may have caused the error. Error: httpd: malformed header from script
CGI ÇÁ·Î±×·¡¹Ö½Ã °¡Àå ¾î·Á¿î ºÎºÐÀº ¾Æ¸¶µµ À§¿Í °°Àº ¿¡·¯°¡ ³µÀ» ¶§, µð¹ö±ëÀ» ¾î¶»°Ô
ÇØ¾ß ÇÏ´Â °¡ ÀÏ °ÍÀÌ´Ù. UNIX»ó¿¡¼ÀÇ µð¹ö±ëÀº dbx°°Àº µð¹ö±ë ÅøÀ» »ç¿ëÇÏ¿© ½±°Ô ÇØ°áÇÒ ¼ö
ÀÖ¾úÁö¸¸, CGI¿¡ ´ëÇÑ µð¹ö±ëÀº ÀüÇô ´Ù¸¥ »óȲÀ̱⠶§¹®ÀÌ´Ù.
°á±¹ CGI µð¹ö±ëÀ» ¼Õ½±°Ô Çϱâ À§Çؼ´Â, ÀϹÝÀûÀÎ C ÇÁ·Î±×·¥°ú µ¿ÀÏÇϰÔ
UNIX»ó¿¡¼ ½ÇÇàµÉ ¼ö ÀÖµµ·Ï º¯È¯ÇØ¾ß ÇÏ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù.
»ç½Ç CGI ÇÁ·Î±×·¥ÀÌ ÀϹÝÀûÀÎ CÇÁ·Î±×·¥°ú ´Ù¸¥ Á¡Àº ´Ü Çϳª, ÀÔ·ÂÀ¸·Î ¹Þ¾Æ µéÀÌ´Â ÆÄ¶ó
¹ÌÅ͵鿡 ó¸® ¹æ½Ä »ÓÀÌ´Ù. Áï, óÀ½ºÎÅÍ ÀÔ·ÂÀ» ¹ÞÀ» ¼ö Àִ â±¸¸¦ µÎ °¡ÁöÇüÅ·ΠÀÛ¼ºÀ» ÇÑ
´Ù¸é, µð¹ö±ë ¶§¹®¿¡ °í»ýÀ» ÇÒ Çʿ䰡 ¾ø´Ù´Â °á·ÐÀÌ ³ª¿Â´Ù.
¾Æ·¡¿¡ ÀÌ·¯ÇÑ ÇüÅÂÀÇ ¿¹Á¦ ÇÁ·Î±×·¥À» º¸¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
1.1 µð¹ö±ëÀ» À§ÇÑ ¿¹Á¦ ÇÁ·Î±×·¥
%c", 10); printf("\n
%s = %s%c", entries[x].name,
entries[x].val, 10);
printf("\n1.2 ÄÄÆÄÀÏ ¹æ¹ý
- µð¹ö±ëÀ» À§ÇÑ ÄÄÆÄÀÏ
cc -o query query.c -DDEBUG
- CGI ÇÁ·Î±×·¥À¸·Î ÄÄÆÄÀÏ
cc -o query.cgi query.c
1.3 ½ÇÇà°á°ú
name = armian
tel = 042-828-5045
2.1 GET,POST METHOD ó¸®
CGI¿¡¼´Â µÎ °¡Áö ÇüÅÂÀÇ METHOD¸¦ »ç¿ëÇÏ¿© ºê¶ó¿ìÀú¿Í CGI»çÀÌ¿¡¼ »ç¿ëµÇ´Â ÆÄ¶ó¹ÌÅ͸¦ Àü´ÞÇÑ´Ù. ¹Ù·Î GET Method¿Í POST MethodÀε¥, CGI ÇÁ·Î±×·¡¹Ö½Ã¿¡ Á¾Á¾ Method¸¦ ¹Ù²Ù¾î ¾ß ÇÒ Çʿ䰡 ¹ß»ýÇϱ⵵ Çϰí, µÎ °¡Áö Method¸¦ µ¿½Ã¿¡ Áö¿øÇÒ Çʿ䵵 ÀÖ´Ù. ÀÌ·¯ÇÑ »óȲÀ» ÇØ°áÇϱâ À§ÇØ, µÎ °¡Áö Method¸¦ ¸ðµÎ ´Ù »ç¿ëÇÒ ¼ö ÀÖµµ·Ï CGI ÇÁ·Î±×·¥ÀÇ ÆÄ ¶ó¹ÌÅÍ Ã³¸® ºÎºÐÀ» º¯°æÇÑ ÇÁ·Î±×·¥Àº ¾Æ·¡¿Í °°´Ù.
printf("Content-type: text/html%c%c", 10, 10);
if (!strcmp(getenv("REQUEST_METHOD"), "GET"))
{
......
GET METHOD ó¸® ·çƾ
......
}
else if (!strcmp(getenv("REQUEST_METHOD"), "POST"))
{
......
POST METHOD ó¸® ·çƾ
......
}
else
{
......
ERROR ó¸® ·çƾ
......
}
2.2 HTTP_USER_AGENT¸¦ ÀÌ¿ëÇÑ Ã³¸®
HTTP_USER_AGENT¸¦ ÀÌ¿ëÇÏ¿©, »ó´ë¹æÀÇ ºê¶ó¿ìÀúŸÀÔÀ» ¾Ë ¼ö Àִµ¥, À̸¦ ÀÌ¿ëÇÏ¿©
°¢°¢ÀÇ ºê¶ó¿ìÀú¿¡ Àû´çÇÑ Çü½ÄÀÇ Ãâ·ÂÀ» ÇàÇÒ ¼ö ÀÖ´Ù.
¿¹¸¦µé¾î, lynx°°Àº ¶óÀθðµå ºê¶ó¿ìÀú´Â ÅØ½ºÆ® ¹Û¿¡ Ãâ·ÂÀÌ ¾ÈµÇ¹Ç·Î, ´Ù¸¥ ºê¶ó¿ìÀú¿Í´Â
´Ù¸£°Ô Ãâ·ÂÀ» ÇØ¾ß ÇÑ´Ù.
<¿¹Á¦ ÇÁ·Î±×·¥>
2.3 REMOTE_ADDRÀ» ÀÌ¿ëÇÑ Ã³¸®
REMOTE_ADDR¸¦ »ç¿ëÇÏ¿© ÀÚ½ÅÀÇ È¨ÆäÀÌÁö·Î µé¾î¿Â »ó´ë¹æÀÇ IP ¾îµå·¹½º¸¦ ¾ò¾î³¾ ¼ö
ÀÖ´Ù.
ƯÁ¤ÇÑ È£½ºÆ®¿¡ ´ëÇØ Ưº°ÇÑ ÇൿÀ» ÇØ¾ß ÇÒ ¶§ »ç¿ëÇÏ¸é µÈ´Ù.
¿¹¸¦µé¾î, UNIX½Ã½ºÅÛ¿¡¼ °ü¸®ÀÚ(root)·ÎÀÇ ·Î±×ÀÎÀº ±× È£½ºÆ®¿¡¼¸¸ °¡´ÉÇÏ°Ô ÇÒ ¼ö ÀÖ
´Â °Íó·³, Web BBS³ª Á¤º¸°Ë»ö½Ã½ºÅÛÀÇ °ü¶óÀڴ ƯÁ¤ÇÑ È£½ºÆ® ¶Ç´Âµµ¸ÞÀο¡¼¸¸ ·Î±×ÀÎÇϰÔ
ÇÒ ¼ö ÀÖ´Ù.
CGI¿¡¼ ºê¶ó¿ìÀú·ÎÀÇ Ãâ·ÂÀº ±ÍïÀº ÀÛ¾÷ ÁßÀÇ ÇϳªÀÌ´Ù. ÀܼÕÁúµµ ¸¹ÀÌ µé¾î°¡°í, ¾à°£ÀÇ
¼öÁ¤À» ÇÏ·Á¸é, »õ·ÎÀÌ ÄÄÆÄÀϰú ¸µÅ© ÀÛ¾÷À» °ÅÃÄ¾ß Çϱ⠶§¹®¿¡, ½Ã°£µµ ¸¹ÀÌ »¯±â´Â ÀÛ¾÷ÀÌ´Ù.
´ÙÀ½ÀÇ µÎ ¿¹Á¦¸¦ ºñ±³ÇØ º¸¸é, ¾î¶°ÇÑ ¹æ¹ýÀÌ ´õ È¿À²ÀûÀΰ¡¸¦ ¹Ù·Î ¾Ë ¼ö ÀÖ´Ù. ÀÌ ¿¹Á¦µé
Àº ºê¶ó¿ìÀú¸¦ ÅëÇØ ¼¼ °³ÀÇ ÀÔ·Â(name,title,color)À» ¹Þ¾Æ µé¿©, Ãâ·ÂÇÏ´Â °£´ÜÇÑ CGI ÇÁ·Î±×·¥ÀÌ
´Ù.
ù¹øÂ° ¿¹Á¦´Â ÀϹÝÀûÀÎ Ãâ·Â¹æ¹ýÀ¸·Î, ÇÁ·Î±×·¥³»¿¡¼ printf()ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¸ðµç Ãâ·ÂÀ»
ÇàÇÏ´Â ¹æ¹ýÀÌ´Ù.
µÎ¹øÂ° ¿¹Á¦´Â ¿ÜºÎ ÈÀÏ·Î Ãâ·ÂÇϰíÀÚ ÇÏ´Â ³»¿ëÀ» HTML¹®¼·Î ÀÛ¼ºÇØ ³õ°í, »ç¿ëÀÚÀÇ
ÀԷ¿¡ µû¶ó Ãâ·Â³»¿ëÀ» º¯Çü½ÃÄÑ Ãâ·ÂÇÏ´Â ¹æ¹ýÀÌ´Ù.
<¿¹Á¦ 1> ÀϹÝÀûÀÎ Ãâ·Â¹æ¹ý
");
printf("\n\tYour name : %s",name);
printf("\n\tYour Title : %s",title);
printf("\n\tYour Color : %s",color);
printf("\n<¿¹Á¦ 2-1> ÈÀÏÀ» ÀÌ¿ëÇÑ Ãâ·Â¹æ¹ý(HTML Prototype)
Your name : :NAME:
Your Title : :TITLE:
Your Color : :INPUTCOLOR:
<¿¹Á¦ 2-2> ÈÀÏÀ» ÀÌ¿ëÇÑ Ãâ·Â¹æ¹ý(CGI ÇÁ·Î±×·¥)
±âÁ¸ÀÇ ÀÎÅÍ³Ý ÀÀ¿ëµé(telnet, ftp µî)ÀÌ Å¬¶óÀÌ¾ðÆ®¿Í ¼¹ö°¡ °è¼Ó Á¤º¸¸¦ À¯ÁöÇÏ´Â statefull
ÀÎ ¹æ½Ä°ú ´Þ¸®, WWWÀº stateless¸¦ ±â¹ÝÀ¸·Î ¿î¿µµÇ¹Ç·Î Ŭ¶óÀÌ¾ðÆ®¿Í ¼¹ö°£¿¡ Á¤º¸°¡ À¯Áö
µÇÁö ¾Ê´Â´Ù. ÀÌ´Â WWW¸¦ ÀÌ¿ëÇÏ¿© ÀÀ¿ëÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ·Á´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô ¶Ç ´Ù¸¥ ÁüÀ»
Áö¿öÁÖ°Ô µÇ¾ú´Ù.
stateless¸¦ statefulló·³ º¸ÀÌ°Ô Çϱâ À§ÇØ ¿©·¯°¡Áö Æí¹ýµéÀÌ µ¿¿øµÇ°í ÀÖ´Ù.
°ú°ÅÀÇ ÀÀ¿ëÇÁ·Î±×·¥µéÀº in-memory¸¦ »ç¿ëÇÏ¿© ÀÌ·¯ÇÑ Á¤º¸µéÀ» À¯ÁöÇÏ¿´Áö¸¸, CGIÇÁ·Î±×
·¥¿¡¼± file systemÀ» »ç¿ëÇÏ¿© ÀÌ·¯ÇÑ Á¤º¸µéÀ» À¯ÁöÇÒ ¼ö ¹Û¿¡ ¾ø´Ù.
´ÙÀ½ ¿¹Á¦´Â °£´ÜÇÑ ÇüÅ·ΠstatefullÀ» ±¸Çö ÇϱâÀ§ÇÑ ±âº»ÀûÀΠƲ¸¸ º¸¿© ÁØ´Ù.
½ÇÁ¦ÀûÀ¸·Î ÀÀ¿ëÇÁ·Î±×·¥À» ÀÛ¼ºÇϱâ À§Çؼ±, ´õ ¸¹Àº Á¤º¸µéÀÌ ÁÖ°í ¹Þ¾ÆÁ®¾ß¸¸ Çϸç, ÀÌ´Â
¿ÜºÎ ÈÀÏÀ» ÅëÇØ¼ ±¸ÇöµÉ ¼öµµ ÀÖ°í, ¸Þ½ÃÁö Å¥µîÀ» »ç¿ëÇÏ¿© Á» ´õ °í±Þ½º·´°Ô ±¸ÇöÇÒ ¼öµµ
ÀÖ´Ù.
<ÇÁ·Î±×·¥ 1 : daemon.c>
<ÇÁ·Î±×·¥ 2 : server.c>
<ÇÁ·Î±×·¥ 3 : client.c>
PID of Server : %d",pid); printf("\n
Server is dead...."); exit(0); } s_action() { printf("\n
PID of Server : %d",pid); printf("\n
Server is alive...."); exit(0); }