Àü¿µÁØ(Çѱ¹Ç×°ø´ëÇб³ ÄÄÇ»ÅÍ°øÇаú)
|
||||||||||||||||
1. ÅÚ³Ý ÇÁ·ÎÅäÄÝ ÅÚ³ÝÀº ÀÎÅÍ³Ý »çÀÇ ´Ù¸¥ ÄÄÇ»ÅÍ·Î ·Î±×ÀÎÀ»
ÇÒ ¼ö ÀÖ°Ô ÇÏ´Â ÇÁ·ÎÅäÄÝÀÌ´Ù.
2. ÅÚ³Ý ¸í·É¾î ÅÚ³Ý ÇÁ·ÎÅäÄÝÀº ¼¹ö¿Í Ŭ¶óÀ̾ðÆ® ¼·Î¸¦ Á¦¾îÇϱâ
À§ÇÏ¿© ¸¹Àº ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù. ÀÌ·¯ÇÑ ¸í·É¾î´Â IAC(interpret
as command)¹®ÀÚ ´ÙÀ½¿¡ º¸³»Áø´Ù.
3. ÅÚ³Ý ¿É¼Ç ¶ÇÇÑ ¿©·¯ °¡Áö »óŸ¦ ¼³Á¤Çϱâ À§ÇÑ ¿É¼ÇÀÌ ÀÖ´Ù. ÀÌ ¿É¼ÇµéÀº ¾ðÁ¦µçÁö Àç¼³Á¤µÉ ¼ö ÀÖÀ¸¸ç, ¼¹ö³ª Ŭ¶óÀ̾ðÆ® ¾î´À ÂÊ¿¡¼µµ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¿É¼ÇÀÇ Á¤È®ÇÑ ½ºÆåÀº °¢°¢ÀÇ rpc¸¦ Âü°í ÇÏ¿©¾ß ÇÑ´Ù.
¿É¼ÇÀº Ŭ¶óÀ̾ðÆ®³ª ¼¹ö ¾î´À ÇÑÂÊ¿¡¼ ¿ä±¸¸¦ ÇÏ¿©, ´Ù¸¥ ÇÑ ÂÊ¿¡¼ ±×°Í¿¡ ÀÀ´äÇÏ´Â ÇüÅ·Π¼³Á¤µÈ´Ù. ¿É¼ÇÀ» ¿ä±¸ÇÒ ¶§´Â
ÀÇ Â÷·Ê·Î Äڵ带 º¸³»¸ç, ÀÀ´ä ¶ÇÇÑ °°Àº ¹æ½ÄÀÌ´Ù.
WILLÀ̳ª WONT´Â ¿É¼ÇÀ» ¿ä±¸ÇÏ´Â ÂÊÀÌ ±× ¿É¼ÇÀ» »ç¿ë ¶Ç´Â »ç¿ëÇÏÁö ¾Ê°Ú´Ù´Â ¶æÀ̸ç, DO³ª DONT´Â »ó´ë¹æÃø¿¡ ¿É¼ÇÀ» »ç¿ë ¶Ç´Â »ç¿ëÇÏÁö ¸»¶ó°í ¿ä±¸ÇÏ´Â °ÍÀÌ´Ù. ÇÑÂÊ¿¡¼ ¿ä±¸¸¦ ÇÏ¸é »ó´ë¹æÀº ÀÀ´äÀ» ÇØ¾ß ÇÑ´Ù. ¿ä±¸¿Í ÀÀ´äÀÇ Á¶ÇÕÀº ´ÙÀ½ÀÇ °æ¿ì¸¸ÀÌ °¡´ÉÇÏ´Ù.
SB¸í·É¾î´Â Çϳª ÀÌ»óÀÇ ¿É¼ÇÀ» ÇÊ¿ä·Î ÇÒ ¶§ »ç¿ëµÈ´Ù. Å͹̳ΠŸÀÔÀ̳ª, Å͹̳ÎÀÇ Å©±â µîÀ» º¸³»°í ¹Þ´Âµ¥ »ç¿ëµÈ´Ù. ÅÚ³Ý Å¬¶óÀ̾ðÆ®·Î ÅÚ³ÝÀÇ ¿É¼Ç Çù»ó °úÁ¤À» »ìÆ캸ÀÚ.
4. ÅÚ³Ý Å¬¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ¼Ò½º´Â ÇÁ·ÎÅäÄÝÀ» ó¸®ÇÏ´Â protocal.c¿Í
±× ¿ÜÀÇ ¸ðµç ÇÔ¼ö°¡ Æ÷ÇÔµÈ telnet ÅÚ³Ý Å¬¶óÀ̾ðÆ®°¡ ÇØ¾ß ÇÒ ÀÏÀº ±âº»ÀûÀ¸·Î ´ÙÀ½°ú °°´Ù. -¼¹ö·ÎÀÇ stream socket ¿¬°áÀ» ÇÑ´Ù. ¼ÒÄÏ ¿¬°á ¹× Ãʱ⠼³Á¤ ¼¹ö¿Í ¼ÒÄÏÀ» ¿¬°áÇÏ´Â °úÁ¤Àº ´Ù¸¥ stream
socketÀ» ÀÌ¿ëÇÏ´Â ÇÁ·Î±×·¥°ú º°Â÷ÀÌÁ¡ÀÌ ¾ø ¼Ò½ºÀÇ main()¿¡¼ ºÒ¸®¾îÁö´Â init_system()ÇÔ¼ö¸¦
»ìÆ캸ÀÚ. -¼ÒÄÏ¿¡ read()¸¦ È£ÃâÇߴµ¥ ÀÐÀ» µ¥ÀÌÅÍ°¡
¾øÀ» ¶§. ÀÌ ¿Ü¿¡µµ ¸¹Àº °æ¿ì°¡ ÀÖÁö¸¸ ÀÌ ÇÁ·Î±×·¥¿¡¼´Â
À§ÀÇ °æ¿ì¿¡ ºí·ÏÀÌ ÀϾÙ. ºí·ÏÀÌ ÀϾ¸é ÇÁ·Î¼¼¼´Â ºí·ÏÀÌ
ÇØÁ¦µÉ ¶§±îÁö ¸ØÃß¾î Áø´Ù.
¼ÒÄÏÀÇ ¿¬°áÀÌ ²÷°åÀ» ¶§¿¡´Â read()°¡ 0À» ¸®ÅÏÇÏ°í ¶ÇÇÑ write()°¡ SIGPIPE ½Ã±×³ÎÀ» ¹ß»ýÇÑ´Ù. SIGPIPE ½Ã±×³ÎÀ» °¡·ÎèÀ¸·Î¼ ¼ÒÄÏ ¿¬°áÀÌ ²÷°åÀ» ¶§¸¦ ¾Ë ¼ö ÀÖ´Ù.
SIGPIPE ½Ã±×³ÎÀº peer_died()ÇÔ¼ö¿¡ ¿¬°áµÇ¾ú´Ù.
Peer_died()ÇÔ¼ö´Â »ó´ë¹æÀÇ ¿¬°áÀÌ ²÷°åÀ» ¶§ÀÇ °¢Á¾ 󸮸¦ ¼öÇàÇÑ´Ù.
±×·¯¹Ç·Î, ¼ÒÄÏÀÇ ¿¬°áÀÌ ²÷¾îÁ®¼ write()°¡ SIGPIPE ½Ã±×³ÎÀ»
¹ß»ý½ÃÅ°¸é peer_died()ÇÔ¼ö°¡ ½ÇÇàµÈ´Ù. main_loop() main-loop() ÇÔ¼ö´Â ÅÚ³Ý Å¬¶óÀ̾ðÆ®ÀÇ ÀϹÝÀûÀÎ
ÀÛ¾÷À» ¼öÇàÇÑ´Ù. ÇϳªÀÇ ¹«ÇÑ·çÇÁÀÎ ÀÌ ÇÔ¼ö´Â ¼ÒÄÏ°ú µ¥ÀÌÅÍÀÇ
ÀÔÃâ·Â, ±×°ÍÀÇ ÇÁ·ÎÅäÄÝ Ã³¸® ±×¸®°í Å°º¸µå·ÎºÎÅÍÀÇ ÀÔ·ÂÀ» ó¸®ÇÏ´Â
°úÁ¤À» ¹Ýº¹Çؼ ó¸®ÇÑ´Ù.
¿ì¸®°¡ ¼ÒÄÏ¿¡ ¾µ µ¥ÀÌÅÍ´Â ¸ÕÀú write_buf¿¡ ÀúÀåµÈ´Ù. ÀÌ µ¥ÀÌÅÍ´Â main_loop()¿¡¼ select()½Ã½ºÅÛ È£Ãâ·Î ¼ÒÄÏ¿¡ µ¥ÀÌÅ͸¦ ¾µ ¼ö ÀÖ´Ù´Â °ÍÀÌ È®ÀÎµÈ µÚ¿¡¾ß write_socket()ÇÔ¼ö¸¦ ÅëÇؼ ½ÇÁ¦·Î Àü¼ÛÀÌ µÈ´Ù. ¼ÒÄÏÀ¸·Î ÀÐÀº µ¥ÀÌÅÍ´Â ÀÐÀ» µ¥ÀÌÅÍ°¡ ÀÖÀ» ¶§¿¡¸¸ read_socket()À» ÅëÇؼ, ¸ðµÎ read_buf¿¡ ÀúÀåµÈ´Ù. read_buf¿¡ ÀúÀåµÈ µ¥ÀÌÅÍ´Â ÇÁ·ÎÅäÄÝ Ã³¸®¸¦ À§ÇÏ¿© process_protocol() ÇÔ¼ö¿¡¼ ÀÐÇôÁø´Ù. Ç¥3Àº ÀÌ·¯ÇÑ µ¥ÀÌÅÍÀÇ Ã³¸® °úÁ¤À» µµ½ÄÀûÀ¸·Î ±×¸° °ÍÀÌ´Ù.
<Ç¥3 µ¥ÀÌÅÍ Ã³¸®°úÁ¤> ¹öÆÛ Ã³¸® ÇÔ¼ö ÅÚ³Ý ÇÁ·ÎÅäÄÝÀ» ó¸®ÇÏ´Â °úÁ¤¿¡¼ ¿ì¸®´Â ¼¹öÂÊÀ¸·Î
ÇÁ·ÎÅäÄÝÀ» º¸³¾ ¼öµµ ÀÖ¾î¾ß ÇÏ°í, ¼ÒÄÏ¿¡¼ ÀÐÇôÁø µ¥ÀÌÅ͸¦ ÆĽÌÇÏ¿©
ÇÁ·ÎÅäÄÝ Ã³¸®¸¦ ÇÒ ¶§¿¡´Â read_buf¿¡¼ Çϳª¾¿ ¹®ÀÚ¸¦ Àоî¼
ÇÊ¿äÇÑ ÇÁ·ÎÅäÄÝ ºÎºÐÀ» ÃßÃâÇØ¾ß ÇÑ´Ù. putc_socket()°ú puts_socket()Àº write_buf¿¡
µ¥ÀÌÅ͸¦ Áý¾î³Ö´Â ÇÔ¼öÀÌ´Ù. ÀÌ·¯ÇÑ ÆíÀÇÇÔ¼öµéÀº ÀüºÎ ÇÁ·ÎÅäÄÝÀ» ó¸®ÇÏ´Â
°úÁ¤¿¡¼ ÇÊ¿äÇÑ ÇÔ¼öµéÀÌ´Ù. ÅÚ³Ý ÇÁ·ÎÅäÄÝ ÆÄ½Ì process_protocol()Àº read_buf¿¡ ÀúÀåµÈ µ¥ÀÌÅ͸¦
ÆĽÌÇÏ¿© ÅÚ³Ý ÇÁ·ÎÅäÄÝÀ» ó¸®ÇÑ´Ù. ÀÌ
¿©±â¼ TELCMDS, TELOPTS¸¦ #include ¾Õ¿¡¼
Á¤ÀÇÇÑ ÀÌÀ¯´Â telnet.h¿¡ ÀÖ´Â ÅÚ³Ý ¸í·É¾î Å×À̺íÀÎ telcmds¿Í,
ÅÚ³Ý ¿É¼Ç Å×À̺íÀÎ telopts¸¦ »ç¿ëÇϱâ À§ÇؼÀÌ´Ù. ÅÚ³Ý ¿É¼Ç ó¸® process_option()Àº IAC+[DO|DONT|WILL|WONT]À¸·Î ½ÃÀ۵Ǵ ¿É¼ÇÀ» ó¸®ÇÏ´Â ÇÔ¼öÀÌ´Ù. ¿É¼ÇÀ» ó¸®Çϴµ¥ ÀÖ¾î¼ °¡Àå ¾î·Á¿î Á¡Àº ÅÚ³Ý ¿É¼Ç Çù»ó °úÁ¤ÀÌ ´ëĪÀûÀ̶õ Á¡ÀÌ´Ù. Áï ¶È °°Àº ¿É¼ÇÀ» ¹ÞÀ» ¼ö ÀÖ°í, º¸³¾ ¼öµµ ÀÖ¾î¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. ÀÌ·² ¶§´Â ¼¹ö·ÎºÎÅÍ ¹ÞÀº ¿É¼ÇÀÌ ¿ì¸®°¡ º¸³½ ¿É¼ÇÀÇ ÀÀ´äÀÎÁö ¾Æ´Ï¸é ¿ä±¸¸¦ ÇÏ´Â ¸í·ÉÀÎÁö¸¦ ±¸ºÐÇϱⰡ ¾î·Æ´Ù. ÀÌ Ã³¸®¸¦ Çϱâ À§Çؼ option[]¹è¿À» ¸¸µé¾ú´Ù. options[]ÀÇ °¢°¢ÀÇ Çʵå´Â ÇØ´ç ¿É¼Ç¿¡ ´ëÇØ
¿ä±¸¸¦ Çß´ÂÁöÀÇ ¿©ºÎ¸¦ ÀúÀåÇÑ´Ù. option_requested()´Â ÇØ´ç ¿É¼ÇÀÌ ¿ä±¸µÇ¾ú´ÂÁö
¿©ºÎ¸¦ ÆÇ´ÜÇÑ´Ù. ÀÌ°ÍÀÌ 'Âü'À» ¸®ÅÏÇϸé ÇØ´ç ¿É¼ÇÀÌ ¿ä±¸µÇ¾ú´Ù´Â
°ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¿ì¸®°¡ ¿É¼ÇÀ» ¼¹ö¿¡ º¸³¾
¶§¿¡´Â option_requestd()¸¦ È£ÃâÇÏ¿© ¿É¼Ç ¿ä±¸ »óŸ¦ ¼³Á¤ÇÏ°í,
¿É¼ÇÀ» ¼¹ö·ÎºÎÅÍ ¹ÞÀ» ¶§¿¡´Â ±×°ÍÀÌ ¿ä±¸ÀÎÁö ÀÀ´äÀÎÁöÀÇ ¿©ºÎ¸¦
option_requested()¸¦ È£ÃâÇÔÀ¸·Î½á ÆÇ´ÜÇÑ´Ù. ¿É¼Ç Çù»ó °úÁ¤À» ÅëÇØ Ã³¸®µÈ ¿É¼ÇÀÌ ÀúÀåµÇ¾î¾ß
ÇÒ °æ¿ì¿¡´Â ÀÌ Á¤º¸¸¦ mode¿¡ ÀúÀåÇÑ´Ù. ECHOÀÇ ¿©ºÎ(MODE_ECHO)³ª
¹ÙÀ̳ʸ® ¸ðµåÀÎÁöÀÇ ¿©ºÎ (MODE_INBIN, MODE_OUTBIN) µîÀÌ ÀÌ·¯ÇÑ
Á¤º¸´Ù. Mode¸¦ ´Ù·ç´Â ÇÔ¼ö´Â mode_set() ÀÌ´Ù. °¡°ø ¸ðµå¿¡ ´ëÇÑ
Á¤ÀÇ´Â arpa/telnet.h¿¡ Æ÷ÇԵǾî ÀÖ´Ù. ¿ì¸®°¡ ´Ù·ç´Â ¸ðµå´Â ¸ðµÎ
set_terminal()¿¡¼ 󸮵ȴÙ. ÅÚ³Ý ÇÁ·ÎÅäÄÝÀÇ Á¤ÀÇ¿¡ µû¸£¸é ÅÚ³Ý Å¬¶óÀ̾ðÆ®´Â
¸ðµç ÅÚ³Ý ¿É¼ÇÀ» ó¸®ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù°í µÇ¾î ÀÖ´Ù. ¿ì¸®°¡ Áö¿øÇÏÁö
¾Ê´Â ¿É¼ÇÀÌ¶óµµ ¼¹ö°¡ ¿ä±¸Çϸé ÀÀ´äÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. Option_ok()´Â
¿É¼ÇÀÌ ÇöÀç Áö¿øµÇ´ÂÁö ¿©ºÎ¸¦ ÆÇ´ÜÇÑ´Ù. TELOPT_BINARY ¿É¼ÇÀº 8ºñÆ® µ¥ÀÌÅÍÀÇ Ã³¸® ¿©ºÎ¸¦ °áÁ¤ÇÏ´Â ¿É¼ÇÀÌ´Ù. ¼¹ö°¡ WILL ¶Ç´Â WONT·Î ¿ä±¸ÇßÀ» °æ¿ì¿¡´Â ¼¹ö°¡ 8 ºñÆ® µ¥ÀÌÅ͸¦ ó¸®ÇÒÁö ¿©ºÎ¸¦ ¸»ÇÏ´Â °ÍÀ̹ǷÎ, ¿ì¸®´Â MODE_INBIN Áï 8ºñÆ®¸¦ ¹Þ¾ÆµéÀÌ°Ú´Ù´Â ¸ðµå¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. TELOPT_BINARY°¡ DO ¶Ç´Â DONT¸¦ ¿ä±¸ÇÑ´Ù¸é À̴ Ŭ¶óÀ̾ðÆ®ÀÇ 8ºñÆ® ó¸® ¿©ºÎÀÌÅ©·Î, Ʋ¶óÀ̾ðÆ®°¡ 8ºñÆ®¸¦ Ãâ·ÂÇÏ°Ú´Ù´Â MODE_OUTBINÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù. TELOPT_ECHO´Â Å͹̳ÎÀÌ Å°º¸µå·ÎºÎÅÍÀÇ ÀÔ·ÂÀ» ECHOÇØ¾ß ÇÏ´ÂÁö¸¦ ¼³Á¤ÇÑ´Ù. ¼¹ö°¡ ECHO¸¦ ÇÏ°Ú´Ù¸é ÄöóÀ̾ðÆ®´Â ECHO¸¦ ÇÏÁö ¸»¾Æ¾ßÇÏ°í, ¼¹ö°¡ ECHO¸¦ ÇÏÁö ¾Ê°Ú´Ù¸é Ŭ¶óÀ̾ðÆ®´Â ECHO¸¦ ÇؾßÇÑ´Ù. Network Virtual Terminal ÅÚ³Ý ÇÁ·ÎÅäÄÝÀº Network Virtual Terminal(NVT)¸¦ Æ÷ÇÔÇÑ´Ù. Ŭ¶óÀ̾ðÆ®´Â ¼¹ö·ÎºÎÅÍ ¹ÞÀº NVTÄڵ带 ȸé 󸮸¦ À§ÇÑ ÀûÀýÇÑ ÄÚµå·Î ¹Ù²Ù¾î¾ß ÇÏ°í, »ç¿ëÀÚ Å°º¸µå·ÎºÎÅÍ ¹ÞÀº ÀÔ·ÂÀ» NVTÄÚµå·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. ÀÌ°ÍÀº CR/NL ¸ÊÆÃ, ÅÇÀÇ Ã³¸® µîÀ» Æ÷ÇÔÇÑ´Ù. ¿ì¸®ÀÇ ÇÁ·Î±×·¥Àº ÀÌ·¯ÇÑ Ã³¸®¸¦ set_terminal()¿¡¼ Å͹̳Π¼¼ÆÃÀ» ÅëÇؼ ÇàÇÑ´Ù. ±×·¯³ª ÀÌ°ÍÀº NVT¸¦ ¿Ïº®È÷ Áö¿øÇÏÁö ¾Ê´Â´Ù. ´Ù¸¸ °£´ÜÈ÷ Çϱâ À§ÇÑ ÇØÅ·ÀÌ´Ù. ÇÁ·Î±×·¥ Á¾·á ÇÔ¼ö ÇÁ·Î±×·¥À» ³¡³»´Â ÇÔ¼ö·Î´Â peer_died(), do_bye(),
sys_error()°¡ ÀÖ´Ù. -close()·Î ¼ÒÄÏÀ» ´Ý´Â´Ù. Set_terminal()¿¡¼ Å͹̳ÎÀ» Ç×»ó raw ¸ðµå·Î ¸¸µç´Ù(¿ÏÀüÇÑ raw ¸ðµå´Â ¾Æ´Ï´Ù). ±×·¡¼ »ç¿ëÀÚÀÇ Å°º¸µå ÀÎÅÍ·´Æ® µîÀÌ µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. ¿ì¸®°¡ escape character¸¦ Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ ÇöÀç do_bye()¸¦ ÅëÇØ »ç¿ëÀÚ°¡ ÇÁ·Î±×·¥À» °Á¦ Á¾·á ½Ãų ¼ö´Â ¾ø´Ù.
5. °£´ÜÇÑ ÅÚ³Ý Å¬¶óÀ̾ðÆ®ÀÇ ¼Ò½º ÅÚ³ÝÀÇ ¿É¼ÇÀº ¸¹°íµµ ¾ÆÁÖ º¹ÀâÇÏ´Ù. ÀÌ·¯ÇÑ Ã³¸®¸¦ ¸ðµÎ Áö¿øÇϱâ À§Çؼ´Â ÇÁ·Î±×·¥ÀÌ »ó´çÈ÷ º¹ÀâÇØÁø´Ù. ¿©±â¼´Â °£´ÜÈ÷ ÇÊ¿äÇÑ ¸î °³ÀÇ ¿É¼Ç¸¸ Áö¿øÇϸç, ¾Ë°í¸®Áòµµ °£´ÜÇÏ°Ô ÇÏ¿© ¿ÏÀüÇÑ ÅÚ³Ý ½ºÆåÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.
7.¸¶Ä¡¸é¼ ÀÌ ÇÁ·Î±×·¥Àº ½ÇÁ¦ÀûÀÎ ¾îÇø®ÄÉÀ̼ǿ¡¼ ¾²À̱⿡´Â ³Ê¹«³ª ¹ö±×°¡ ¸¹°í, ÇÁ·ÎÅäÄÝ Áö¿øÀÌ ºó¾àÇÏ´Ù. ±×·¯³ª ÅÚ³Ý Å¬¶óÀ̾ðÆ® ÇÁ·Î±×·¡¹ÖÀ» ÀÌÇØÇϱ⿡´Â ÃæºÐÇϸ®¶ó »ý°¢µÈ´Ù. ´ÙÀ½ Æí¿¡¼´Â ¼ÒÄÏÀ» ¼¹ö ÇÁ·Î±×·¥ÀÇ ÀÔÀå¿¡¼ ´Ù·ç¾î º»´Ù. |