· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
BeeJNetwork Programming

BeeJ's Guide to Network Programming

ÀÎÅÍ³Ý ¼ÒÄÏ È°¿ë(v.2.3.1, 8-October-2001) http://www.ecst.csuchico.edu/~beej/guide/net

¹ø¿ª : ¹Ú¼ºÈ£(tempter@fourthline.com),1998/8/20

°íÄ£ °úÁ¤
  • °íħ v2.3.1, ¼öÁ¤ÀÏ: 2003-12-15, °íÄ£ÀÌ ±è¼öºÀ
    • html¿¡¼­ À§Å°·Î °íÄ¡°í 2.3.1 ¹öÀüÀ¸·Î °»½ÅÇÏ¿´½À´Ï´Ù.
    • ¿ø·¡ÀÇ ¹ø¿ª±ÛÀº [http]¿©±â ÀÔ´Ï´Ù.



³»¿ë

Contents

1. ½ÃÀÛ
1.1. ´ë»ó
1.2. »ç¿ëµµ±¸
1.3. °ø½Ä ȨÆäÀÌÁö
1.4. Solaris/SunOS ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ À¯ÀÇ»çÇ×
1.5. À©µµ¿ì ÇÁ·Î±×·¡¸ÓµéÀ» À§ÇÑ ÁÖÀÇ»çÇ×
1.6. À̸ÞÀÏ Á¤Ã¥
1.7. ¹Ì·¯¸µ
1.8. ¹ø¿ªÀÚ¿¡°Ô
1.9. ÀúÀ۱ǰú ¹èÆ÷±Ç
2. ¼ÒÄÏÀ̶õ ¹«¾ùÀΰ¡.
2.1. µÎ°¡Áö Á¾·ùÀÇ ¼ÒÄÏ
2.2. ³×Æ®¿öÅ© À̷аú Àú ¾Æ·¡ÀÇ ¾Ë ¼ö ¾ø´Â °Íµé
3. ±¸Á¶Ã¼µé°ú µ¥ÀÌŸ ó¸®
3.1. ¼ø¼­ ¹Ù²Ù±â
3.2. IPÁÖ¼Ò´Â ¹«¾ùÀÌ¸ç ¾î¶»°Ô ´Ù·ç´Â°¡?
4. ½Ã½ºÅÛ ÄÝ
4.1. socket() ; ÆÄÀÏ ±â¼úÀÚ¸¦ Àâ¾Æ¶ó
4.2. bind() ; ³ª´Â ¾î¶² Æ÷Æ®¿¡ ¿¬°áµÇ¾ú³ª?
4.3. connect() ; ¾îÀÌ~ °Å±â~
4.4. listen() ; ´©°¡ ÀüÈ­ Á» °É¾îÁÖÁö~
4.5. accept() ; Æ÷Æ® 3490¿¡ ÀüÈ­°É¾îÁּż­ °¨»çÇÕ´Ï´Ù.
4.6. send(), recv() ; ¸» Á» ÇغÁ~
4.7. sendto(), recvfrom() ; ¸» Á» ÇغÁ~ µ¥ÀÌÅͱ׷¥ ¹æ½Ä
4.8. close(), shutdown() ; ²¨Áö¼î.
4.9. getpeername() ; ´©±¸½Ê´Ï±î?
4.10. gethostname() ; ³­ ´©±¸Àΰ¡?
4.11. DNS ; whitehouse.gov - 198.137.240.100
5. Ŭ¶óÀ̾ðÆ®-¼­¹öÀÇ ¹è°æ
5.1. °£´ÜÇÑ ½ºÆ®¸² ¼­¹ö
5.2. °£´ÜÇÑ ½ºÆ®¸² Ŭ¶óÀ̾ðÆ®
5.3. µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ
6. ¾à°£ ¼öÁØ ³ôÀº ±â¹ýµé
6.1. ºí·ÎÅ·
6.2. select() ; µ¿±âÈ­µÈ Áߺ¹ ÀÔÃâ·Â. ´ë´ÜÇϱº!
6.3. ÀϺκÐÀÇ send()µéÀ» ´Ù·ç±â
6.4. Son of Data Encapsulation
7. Âü°í»çÇ×
7.1. ¸Ç ÆäÀÌÁö
7.2. Âü°í ¼­Àû
7.3. À¥ »óÀÇ Âü°í¼­
7.4. RFC
8. ¸¹ÀÌ ÇÏ´Â Áú¹®µé
9. ÁÖÀÇ»çÇ× ¹× ¿¬¶ôó



1. ½ÃÀÛ

¼ÒÄÏ ÇÁ·Î±×·¥ÀÌ ¾î·Æ³ª¿ä? ±×³É ¸ÇÆäÀÌÁö¸¸ º¸°í¼­´Â ¾Ë¾Æ³»±â°¡ Á» ¾î·´³ª¿ä? ¹º°¡ À־ÀÌ´Â ÀÎÅÍ³Ý ÇÁ·Î±×·¥À» ¸¸µé°í ½ÍÁö¸¸ bind()¸¦ È£ÃâÇÏ°í connect()¸¦ È£ÃâÇÏ°í ÀÌ·± Àú·± ±¸Á¶Ã¼¸¦ µÚÁö°í ÇÒ ½Ã°£ÀÌ ¾ø³ª¿ä?

±Û½ê¿ä, Á¦°¡ ±× Áö°Ü¿î°É ´Ù Çسõ¾Ò°í¿ä, ¿©·¯ºÐ°ú ÀÌ Á¤º¸¸¦ °øÀ¯ÇÏ°í ½Í±º¿ä. ¹Ù·Î ã¾Æ¿À¼Ì½À´Ï´Ù. ÀÌ ¹®¼­°¡ ¹Ù·Î Æò±ÕÀûÀÎ C ÇÁ·Î±×·¡¸Ó¿¡°Ô ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡ °ü·ÃµÈ Á¤º¸¸¦ µå¸±°Ì´Ï´Ù.


1.1. ´ë»ó

ÀÌ ¹®¼­´Â ¾È³»¼­ÀÌÁö ·¹ÆÛ·±½º´Â ¾Æ´Õ´Ï´Ù. ¾Æ¸¶µµ ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» óÀ½ ½ÃÀÛÇϸ鼭 ¾îµð¼­ºÎÅÍ ÇØ¾ß ÇÒÁö ¸ð¸£´Â »ç¶÷µé¿¡°Ô µµ¿òÀÌ µÉ°Ì´Ï´Ù. ¹°·Ð ¾î¶² Àǹ̿¡¼­µµ ÀÌ ±ÛÀº ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ¿Ïº®ÇÑ ¾È³»¼­´Â ¾Æ´Ò °Ì´Ï´Ù. ´ÜÁö µµÀúÈ÷ Àǹ̸¦ ¾Ë ¼ö ¾ø´ø ¸ÇÆäÀÌÁöµéÀ» Á¶±Ý¾¿ ÀÌÇØÇÏ°Ô µÇ±â¸¸ ¹Ù¶ö »ÓÀÔ´Ï´Ù.


1.2. »ç¿ëµµ±¸

´ëºÎºÐÀÇ ÄÚµå´Â ¸®´ª½º PC¿¡¼­ GNUÀÇ gcc¸¦ ÀÌ¿ëÇÏ¿© ÄÄÆÄÀÏ µÇ¾ú½À´Ï´Ù. ¾Æ¸¶µµ gcc¸¦ »ç¿ëÇÏ´Â ¾î¶² Ç÷§Æû¿¡¼­µµ ÄÄÆÄÀÏ µÉ °ÍÀÔ´Ï´Ù. ´ç¿¬È÷ ÀÌ°ÍÀº À©µµ¿ìÁ ÇÁ·Î±×·¡¹ÖÇÒ¶§´Â Àû¿ëµÇÁö ¾Ê½À´Ï´Ù. ¾Æ·¡ÀÇ À©µµ¿ì ÇÁ·Î±×·¡¹Ö ¼½¼ÇÀ» º¸½Ê½Ã¿À. (ÀÌÇÏ Á¸Äª »ý·«)

1.3. °ø½Ä ȨÆäÀÌÁö

ÀÌ ¹®¼­ÀÇ °ø½ÄÀûÀÎ À§Ä¡´Â chicoÀÇ Ä¶¸®Æ÷´Ï¾Æ ÁÖ¸³´ëÇÐÀÇ http://www.ecst.csuchico.edu/~beej/guide/net/ ÀÌ´Ù.

1.4. Solaris/SunOS ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ À¯ÀÇ»çÇ×

Solaris³ª SunOS¸¦ À§ÇØ ÄÄÆÄÀÏ ÇÒ¶§ ¸î¸îÀÇ ÀûÀýÇÑ ¶óÀ̺귯¸®¸¦ ¸µÅ©Çϱâ À§ÇØ Æ¯º°ÇÑ Ä¿¸Çµå ¶óÀÎ ½ºÀ§Ä¡¸¦ ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¾Æ·¡Ã³·³ "lnsl -lsocket -lresolv"¸¦ ÄÄÆÄÀÏ ¸í·ÉÀÇ ³¡¿¡ µ¡ºÙ¿©¶ó.

$cc -o server server.c -lnsl -lsocket -lresolv

¸¸¾à ¿©ÀüÈ÷ ¿¡·¯°¡ ³­´Ù¸é "-lxnet"¸¦ Ä¿¸Çµå ¶óÀÎ ³¡¿¡ µ¡ºÙÀÏ ¼öµµ ÀÖ´Ù. ³ª´Â ±×°ÍÀÌ Á¤È®È÷ ¹«¾ùÀ» ÇÏ´ÂÁö´Â ¸ð¸£Áö¸¸ »ç¶÷µéÀÌ ±×°ÍÀÌ ÇÊ¿äÇÏ´Ù°í ÇÑ´Ù.

¹®Á¦°¡ ¹ß»ýÇÏ´Â ¶Ç´Ù¸¥ ÁöÁ¡Àº setsockopt()¸¦ È£ÃâÇÏ´Â ºÎºÐÀÌ´Ù. ÇÔ¼ö ¿øÇüÀÌ ³» ¸®´ª½º ¹Ú½º¿Í ´Ù¸£´Ù, µû¶ó¼­

int yes=1;

´ë½Å¿¡

char yes='1';
À» ÀÔ·ÂÇ϶ó

³»°¡ Sun¹Ú½º¸¦ °¡Áö°í ÀÖÁö ¾Ê±â ¶§¹®¿¡, À§ÀÇ ¾î¶² Á¤º¸µµ Å×½ºÆ®Çغ¸Áö ¾Ê¾Ò´Ù-- ÀÌ°ÍÀº »ç¶÷µéÀÌ e-mail·Î ³ª¿¡°Ô ¾Ë·ÁÁØ °ÍµéÀÌ´Ù.

1.5. À©µµ¿ì ÇÁ·Î±×·¡¸ÓµéÀ» À§ÇÑ ÁÖÀÇ»çÇ×


³ª´Â Ưº°È÷ À©µµ¿ì¸¦ ½È¾îÇÏ°í Linux³ª BSD¶Ç´Â Unix¸¦ ½áº¸±â¸¦ ±ÇÇÏÁö¸¸ ¿©ÀüÈ÷ À©µµ¿ì¿¡¼­ »ç¿ëÇÏ°Ú´Ù´Â »ç¶÷µéÀÌ ÀÖ¾ú´Ù. ù¹ø°·Î, ³»°¡ ¿©±â¼­ ¾ð±ÞÇÑ ²Ï¸¹Àº Çì´õÆÄÀϵéÀº ¹«½ÃÇ϶ó. ´ç½ÅÀÌ Æ÷ÇÔÇؾßÇÒ °ÍÀº

#include <winsock.h>

»ÓÀÌ´Ù.

Àá±ñ! ´ç½ÅÀº ¶ÇÇÑ ¼ÒÄ϶óÀ̺귯¸®·Î ¾î¶²ÀÏÀ» Çϱâ Àü¿¡ WSAStartup()¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ±×°ÍÀ» Çϱâ À§ÇÑ ÄÚµå´Â ´ÙÀ½°ú °°´Ù.

#include <winsock.h>

{
    WSADATA wsaData;  //if this doesn't work
    //WSAData wsaData; //then try this instead
 
    if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0){
       fprintf(stderr, "WSAStartup failed.\n");
       exit(1);
    }

´ç½ÅÀº ¶ÇÇÑ ´ç½ÅÀÇ ÄÄÆÄÀÏ·¯°¡ ÀϹÝÀûÀ¸·Î wsock3.lib³ª winsock32.lib·Î ºÒ¸®´Â Winsock¶óÀ̺귯¸®¸¦ ¸µÅ©Çϵµ·Ï ÇؾßÇÑ´Ù. VC++ÇÏ¿¡¼­´Â À̰͵éÀº Project¸Þ´ºÀÇ Setting¾Æ·¡¿¡¼­ LinkÅÇÀ» Ŭ¸¯Çؼ­ "Object/library modules"¸¦ ÅëÇØ ÀÌ·ç¾î Áø´Ù. "wsock32.lib"¸¦ ±× ¸®½ºÆ®¿¡ µ¡ºÙ¿©¶ó. ¶ó°í µé¾ú´Ù.

¸¶Áö¸·À¸·Î ´ç½ÅÀº WSAClenaup()¸¦ ¼ÒÄ϶óÀ̺귯¸®¸¦ ´Ù ¾´ÈÄ¿¡ È£ÃâÇØ¾ß ÇÑ´Ù. ÀÚ¼¼ÇÑ °ÍÀº ¿Â¶óÀÎ µµ¿ò¸»À» º¸¶ó.

ÀÏ´Ü ±×°ÍÀ» Çϸé ÀÌ ¾È³»¼­ÀÇ ³ª¸ÓÁö ¿¹Á¦´Â ¸î¸î ¿¹¿Ü¸¦ Á¦¿ÜÇÏ°í ÀϹÝÀûÀ¸·Î Àû¿ëµÉ°ÍÀÌ´Ù. Çϳª ¿¹¸¦ µé¸é, ´ç½ÅÀº close()¸¦ ¼ÒÄÏÀ» ´Ý±âÀ§ÇØ »ç¿ëÇÒ¼ö ¾ø°í closesocket()¸¦ ´ë½Å »ç¿ëÇØ¾ß ÇÑ´Ù. ¶ÇÇÑ select()´Â ÆÄÀϱâ¼úÀÚ(stdinÀÇ 0°°Àº)°¡ ¾Æ´Ï°í ¼ÒÄÏ ±â¼úÀÚ¿¡¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

´ç½ÅÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Â ¼ÒÄÏ Å¬·¡½ºÀÎ CSocketµµ ÀÖ´Ù. ´õ ¸¹Àº Á¤º¸´Â ´ç½ÅÀÇ ÄÄÆÄÀÏ·¯ÀÇ µµ¿ò¸»ÆäÀÌÁö¸¦ Âü°íÇ϶ó.

Winsock¿¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸¸¦ ¾ò±âÀ§Çؼ­´Â Winsock FAQ¸¦ ÀÐ°í °Å±â¼­ ½ÃÀÛÇ϶ó.

¸¶Áö¸·À¸·Î ³ª´Â À©µµ¿ìÁî°¡ fork() ½Ã½ºÅÛ È£ÃâÀÌ ¾ø´Ù°í µé¾ú´Âµ¥ ±×°ÍÀº ³ªÀÇ ¸î¸î ¿¹Á¦¿¡¼­ ¾²ÀÌ°í ÀÖ´Ù. ¾Æ¸¶µµ POSIX¶óÀ̺귯¸®³ª ±×°ÍÀÌ ÀÛµ¿ÇÏ°ÔÇϱâ À§ÇÑ ¾î¶²°ÍÀ» ¸µÅ©Çϰųª ¸Å°³º¯¼ö°¡ ¾ø´Â fork()´ë½Å 48¾ï°³ÀÇ ¸Å°³º¯¼ö¸¦ °¡Áö´Â CreateProcess()¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ¸¸¾à ´ç½ÅÀÌ ±×·¸°Ô±îÁö Çϱ⠽ȴٸé CreateThread()´Â Á» ´õ ¿ä¾àÇϱ⠽±´Ù. ºÒÇàÇÏ°Ôµµ ¸ÖƼ½º·¹µùÀº ÀÌ ¹®¼­ÀÇ ¹üÀ§¿¡¼­ ¹þ¾î³­´Ù. ³»°¡ À̾߱â ÇÒ ¼ö Àִ°ÍÀº ¿©±â±îÁö´Ù.

1.6. À̸ÞÀÏ Á¤Ã¥


³ª´Â À̸ÞÀÏ Áú¹®¿¡ ´äÇÒ¼ö ÀÖ´Â ¿©À¯°¡ ÀÖÀ¸´Ï ÆíÇÏ°Ô ¸ÞÀÏÀ» º¸³»µµ µÇÁö¸¸ ´äÀåÀ» º¸³½´Ù°í È®½ÅÇÒ ¼ö´Â ¾ø´Ù. ³ª´Â ²Ï ¹Ù»Ú°Ô »ì°í À־ ´ç½ÅÀÌ º¸³½ Áú¹®¿¡ ´äÇÒ ¼ö ¾øÀ»¶§µµ ÀÖ´Ù. ±×·² °æ¿ì¿¡´Â ³ª´Â º¸ÅëÀº ¸Þ½ÃÁö¸¦ Áö¿î´Ù. °³ÀÎÀûÀÎ °¨Á¤Àº ¾ø´Ù; ´ç½ÅÀÌ ¿ä±¸ÇÑ ÀÚ¼¼ÇÑ ´äº¯À» ÇÒ ¼ö ¾øÀ» »ÓÀÌ´Ù.

´ë°³ Áú¹®ÀÌ º¹ÀâÇÒ ¼ö·Ï ´äº¯ÀÌ ¾øÀ» È®·üÀÌ ³ô´Ù. ¸¸¾à ¸ÞÀÏ º¸³»±â Àü¿¡ ´ç½ÅÀÇ Áú¹®À» Á¼Àº ¹üÀ§·Î ÇÑÁ¤ÇØ ÁÖ°í ¾î¶² ÀûÀýÇÑ Á¤º¸( Ç÷§Æû, ÄÄÆÄÀÏ·¯, ´ç½ÅÀÌ ¹ÞÀº ¿¡·¯ ¸Þ½ÃÁö, ±×¸®°í ´ç½ÅÀÌ »ý°¢Çϱ⿡ ¿À·ù¸¦ Àâ±â¿¡ Àû´çÇÏ´Ù°í »ý°¢µÇ´Â ¾î¶²°Í)¸¦ Æ÷ÇÔÇÑ´Ù¸é ´äº¯À» È®·üÀº ´õ ³ô¾ÆÁø´Ù. ´õ ¸¹Àº Áú¹®¹ýÀº ESRÀÇ ¹®¼­, [http]How To Ask Questions The Smart Way¸¦ Àо¶ó.

¸¸¾à ´ç½ÅÀÌ ´äº¯À» ¾òÁö ¸øÇß´Ù¸é Á» ´õ ã¾Æº¸°í ´äÀ» ã±âÀ§ÇØ ³ë·ÂÇغ¸°í ±×·¡µµ ¾ÈµÈ´Ù¸é ´ç½ÅÀÌ ¹ß°ßÇÑ Á¤º¸¿Í ³»°¡ ÁÙ ¼ö ÀÖ´Â ÃæºÐÇÑ Á¤º¸¸¦ Æ÷ÇÔÇÑ ¸ÞÀÏÀ» º¸³»¶ó.

³ª´Â ´ç½ÅÀ» ¾î¶»°Ô ¸ÞÀÏÀ» ¾²°í ¾È½á¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ ÀܼҸ®¸¦ Çß´Ù. ³ª´Â Á¤¸»·Î ¸î³â°£ ³»°¡ ÀÌ ¾È³»¼­¿¡´ëÇØ ¹ÞÀº ĪÂù¿¡ ´ëÇØ °¨»çÇÏ°í ½Í´Ù. ±×°ÍÀº Á¤¸» »ç±â¸¦ ²ø¾î¿Ã¸°´Ù.±×¸®°í ±×°ÍÀÌ ¾µ¸ðÀÖ´Ù´Â ¸»À» µè´Â°ÍÀº ³ª¸¦ Á¤¸» ±â»Ú°Ô ÇÑ´Ù. ;-) °í¸¿´Ù!

1.7. ¹Ì·¯¸µ

°øÀûÀ¸·Îµç »çÀûÀ¸·Îµç ¹Ì·¯ÇØ Áشٸé Á¤¸» °í¸¿°Ú´Ù. ¸¸¾à °ø½ÄÀûÀ¸·Î ÀÌ »çÀÌÆ®¸¦ ¹Ì·¯¸µÇÏ°í ³»°¡ ¸ÞÀÎÆäÀÌÁö¿¡¼­ ¸µÅ©Çϱ⸦ ¿øÇÑ´Ù¸é ³ª¿¡°Ô beej@piratehaven.org·Î ¸ÞÀÏÀ» º¸³»¸é µÈ´Ù.


1.8. ¹ø¿ªÀÚ¿¡°Ô

¸¸¾à ´ç½ÅÀÌ ÀÌ ±ÛÀ» ¹ø¿ªÇϱ⸦ ¿øÇÑ´Ù¸é beej@piratehaven.org·Î ¸ÞÀÏ º¸³»´Þ¶ó. ±×·¯¸é ³ª´Â ¸ÞÀÎÆäÀÌÁö¿¡¼­ ´ç½ÅÀÌ ¹ø¿ªÇÑ ±ÛÀ» ¸µÅ©ÇÒ °ÍÀÌ´Ù.

¹ø¿ª¹°¿¡ ´ç½ÅÀÇ À̸§°ú À̸ÞÀÏ ÁÖ¼Ò¸¦ Ãß°¡Çϴ°ÍÀº ÀÚÀ¯´Ù. ¹Ì¾ÈÇÏÁö¸¸ °ø°£ÀÇ Á¦¾à¶§¹®¿¡ ¹ø¿ª¹°À» ³» ½º½º·Î Á¦°øÇÒ ¼ö´Â ¾ø´Ù.

1.9. ÀúÀ۱ǰú ¹èÆ÷±Ç


Beej's Guide to Network Programming´Â ¨Ï 1995-2001 Brian "Beej"Hall¿¡°Ô ÀúÀÛ±ÇÀÌ ÀÖ´Ù.

ÀÌ ¾È³»¼­´Â ³»¿ë¹°ÀÌ º¯ÇüµÇÁö ¾Ê°í, ¿ÏÀüÇÏ°Ô Á¦°øµÇ¸ç, ÀúÀÛ±Ç Á¤º¸°¡ ³²¾ÆÀÖ´ÂÇÑ ¾î¶°ÇÑ ¸Åü·Îµµ ÀçÃâ·ÂµÉ ¼ö ÀÖ´Ù.

ƯÈ÷±³À°Àڵ鿡°Ô ÀÌ ¾È³»¼­¸¦ ±×µéÀÇ Çлýµé¿¡°Ô ÃßõÇϰųª º¹»çº»À» Á¦°øÇϱ⸦ ±ÇÇÑ´Ù.

ÀÌ ¾È³»¼­´Â ¹ø¿ªÀÌ Á¤È®ÇÏ°í ¸ðµç ¹®¼­°¡ ÀçÃâ·ÂµÈ´Ù¸é ÀÚÀ¯·Ó°Ô ¾î¶² ¾ð¾î·Îµµ ¹ø¿ªµÉ ¼ö ÀÖ´Ù. ¹ø¿ªÀº ¹ø¿ªÀÚÀÇ À̸§°ú Á¢±Ù Á¤º¸°¡ Æ÷ÇÔ µÉ ¼öµµ ÀÖ´Ù.

ÀÌ ¹®¼­¿¡ Æ÷ÇÔµÈ C ¼Ò½ºÄÚµå´Â °ø°øÀÇ »ç¿ëÀ» Çã°¡ÇÑ´Ù. ´õ ¸¹Àº Á¤º¸´Â beej@piratehaven.org¿¡°Ô ¹®ÀÇÇ϶ó.



2. ¼ÒÄÏÀ̶õ ¹«¾ùÀΰ¡.

¼ÒÄÏÀ̶õ ´Ü¾î´Â ¸¹ÀÌ µé¾úÀ» °ÍÀÌ´Ù. ±×¸®°í ¾Æ¸¶µµ ±× ¼ÒÄÏÀÌ Á¤È®È÷ ¹«¾ùÀΰ¡¿¡ ´ëÇÏ¿© ±Ã±ÝÇØ Çϱ⵵ ÇßÀ» °ÍÀÌ´Ù. ¼ÒÄÏÀº Á¤±Ô À¯´Ð½º ÆÄÀÏ ±â¼úÀÚ¸¦ ÀÌ¿ëÇÏ¿© ´Ù¸¥ ÇÁ·Î±×·¥°ú Á¤º¸¸¦ ±³È¯ÇÏ´Â ¹æ¹ýÀ» ÀǹÌÇÑ´Ù.

¹¹¶ó°í¶ó?

ÁÁ´Ù. ¾Æ¸¶µµ À¯´Ð½º¸¦ ÀßÇÏ´Â »ç¶÷µéÀÌ ÀÌ·¸°Ô ¾ê±âÇÏ´Â °ÍÀ» µé¾îº» ÀûÀÌ ÀÖÀ» °ÍÀÌ´Ù. "À¯´Ð½º¿¡¼­´Â ¸ðµç°Ô ÆÄÀÏ·Î µÇ¾îÀÖ±º!" ½ÇÁ¦·Î ±×µéÀÌ ¾ê±âÇÏ´Â °ÍÀº ¸ðµç À¯´Ð½º ÇÁ·Î±×·¥µéÀÌ ¾î¶² Á¾·ùÀÇ ÀÔÃâ·ÂÀ» ÇÏ´õ¶óµµ ÆÄÀÏ ±â¼úÀÚ¸¦ ÅëÇؼ­ ÇÏ°Ô µÈ´Ù´Â °ÍÀÌ´Ù. ÆÄÀÏ ±â¼úÀÚ´Â »ç½Ç ¿­·ÁÁø ÆÄÀÏÀ» ÀǹÌÇÏ´Â Á¤¼öÀÏ »ÓÀÌ´Ù. ±×·¯³ª ±× ÆÄÀÏÀº ³×Æ®¿öÅ©°¡ µÉ¼öµµ ÀÖ°í FIFO, ÆÄÀÌÇÁ, Å͹̳Î, ½ÇÁ¦ µð½ºÅ©»óÀÇ ÆÄÀÏÀÌ µÉ¼öµµ ÀÖÀ¸¸ç ±× ¹ÛÀÇ ¹«¾ùµµ ´Ù µÈ´Ù´Â °ÍÀÌ´Ù. À¯´Ð½ºÀÇ ¸ðµç°ÍÀº ÆÄÀÏÀÌ´Ù! µû¶ó¼­ ´ç½ÅÀÌ ÀÎÅͳÝÀ» ÅëÇÏ¿© ¸Ö¸® ¶³¾îÁø ´Ù¸¥ ÇÁ·Î±×·¥°ú Á¤º¸¸¦ ±³È¯Çϱâ À§Çؼ­´Â ÆÄÀÏ ±â¼úÀÚ¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù´Â °ÍÀÌ´Ù. ¹ÏÀ¸¼î~

"¶È¶ÈÀÌ ¾ç¹Ý, ±× ÆÄÀÏ ±â¼úÀÚ´Â µµ´ëü ¾î¶»°Ô ¸¸µå´Â°Å¿ä?" ¶ó´Â°Ô ´ç½ÅÀÇ ¸¾¼Ó¿¡ Áö±Ý ¸· ¶°¿À¸¥ Áú¹®ÀÏ °ÍÀÌ´Ù. ¿©±â¿¡ ´ë´äÀÌ ÀÖ´Ù. socket()À» È£ÃâÇÏ¸é ¼ÒÄÏ ±â¼úÀÚ¸¦ ¾ò°Ô µÇ°í send(), recv()µîÀÇ ¼ÒÄÏ¿¡ °ü·ÃµÈ ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Á¤º¸¸¦ ±³È¯ÇÒ ¼ö ÀÖ´Ù. (man send, man recv¸¦ ÇغÁµµ µÊ)

"Àá±ñ!" ÀÌ·¸°Ô ÀÌÀǸ¦ Á¦±âÇÏ°ÚÁö. "±× ¼ÒÄÏ ±â¼úÀÚ°¡ ÆÄÀÏ ±â¼úÀÚ¶ó¸é µµ´ëü ¿Ö read(),write()¸¦ ¾²¸é ¾ÈµÇ´Â°Å¿ä?" ª°Ô ¸»ÇÏ¸é ¸Â´Ù. ±×·¯³ª send(),recv()¸¦ ¾²´Â °ÍÀÌ ¿©·¯¸ð·Î ³×Æ®¿öÅ©¸¦ ÅëÇÑ Á¤º¸Àü´ÞÀ» Á¦¾îÇϱ⿡ µµ¿òÀÌ µÈ´Ù´Â °ÍÀÌ´Ù.

´ÙÀ½Àº ¹º°¡? ¼ÒÄÏÀÇ Á¾·ù´Â? DARPA ÀÎÅÍ³Ý ÁÖ¼Ò(ÀÎÅÍ³Ý ¼ÒÄÏ), °æ·Î¸í°ú Áö¿ª³ëµå(À¯´Ð½º ¼ÒÄÏ), CCITT X.25 ÁÖ¼Ò(X.25 ¼ÒÄÏ, ±×³É ¹«½ÃÇصµ µÊ)µîÀÌ ÀÖ°í ¾Æ¸¶µµ ´ç½ÅÀÌ ¾²´Â À¯´Ð½º¿¡ µû¶ó¼­ ´õ ¸¹Àº Á¾·ùÀÇ ¼ÒÄϵéÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¹®¼­´Â ù¹ø° (ÀÎÅÍ³Ý ¼ÒÄÏ) Çϳª¸¸ ¼³¸íÇÒ °ÍÀÌ´Ù.




2.1. µÎ°¡Áö Á¾·ùÀÇ ¼ÒÄÏ

ÀÎÅÍ³Ý ¼ÒÄÏ¿¡ µÎ°¡Áö Á¾·ù°¡ ÀÖ³ª? ±×·¸´Ù. À½..»ç½ÇÀº °ÅÁþ¸»ÀÌ´Ù. Á» ´õÀÖ±ä ÇÏÁö¸¸ °ÌÀ» ÁÖ°í ½ÍÁö ¾Ê±â ¶§¹®¿¡ ÀÌ°Í µÎ°¡Áö¸¸ À̾߱â ÇÏ´Â °ÍÀÌ´Ù. RAW ¼ÒÄÏÀ̶ó´Â ¸Å¿ì °­·ÂÇÑ °Íµµ ÀÖÀ¸¸ç Çѹø ºÁµÎ´Â °Íµµ ÁÁ´Ù.

µÎ°¡Áö Á¾·ù´Â ¹«¾ùÀΰ¡? Çϳª´Â ½ºÆ®¸²¼ÒÄÏ ÀÌ°í ´Ù¸¥ Çϳª´Â µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀÌ´Ù. ÀÌÈÄ¿¡´Â SOCK_STREAM, SOCK_DGRAMÀ¸·Î ÁöĪµÉ °ÍÀÌ´Ù. µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀº ºñ¿¬°á ¼ÒÄÏÀ̶ó°íµµ ÇÑ´Ù. (ºñ·Ï ±× ¼ÒÄÏ¿¡¼­µµ ¿øÇÑ´Ù¸é connect()¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. connect()ÀýÀ» ÂüÁ¶ÇÒ°Í)

½ºÆ®¸² ¼ÒÄÏÀº ¾çÃøÀ» ½Å·Ú¼ºÀÖ°Ô ¿¬°áÇØ ÁÖ´Â ¼ÒÄÏÀÌ´Ù. ¸¸¾à µÎ°¡Áö ¾ÆÀÌÅÛÀ» ÀÌ ¼ÒÄÏÀ» ÅëÇÏ¿© º¸³½´Ù¸é ±× ¼ø¼­´Â Á¤È®È÷ À¯ÁöµÉ °ÍÀÌ´Ù. ¿¡·¯±îÁö ±³Á¤µÈ´Ù. ¸¸ÀÏ ¿¡·¯°¡ »ý±ä´Ù¸é ´ç½Å ½Ç¼öÀÌ°í ´ç½Å½Ç¼ö¸¦ ¸·´Â ¹æ¹ýÀº ¿©±â¼­ ¼³¸íÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.

½ºÆ®¸² ¼ÒÄÏÀº ¾îµð¿¡ ¾²À̴°¡? ¾Æ¸¶µµ ÅÚ³ÝÀ̶ó°í µé¾îºÃÀ» °ÍÀÌ´Ù. µé¾îºÃ´À´¢? ±×°Ô ÀÌ ¼ÒÄÏÀ» ¾´´Ù. ÀÔ·ÂÇÑ ¸ðµç ±ÛÀÚ´Â ±× ¼ø¼­´ë·Î Àü´ÞÀÌ µÇ¾ß ÇÏ´Â °æ¿ìÀÌ´Ù. »ç½Ç WWW»çÀÌÆ®ÀÇ Æ÷Æ® 80¿¡ ÅÚ³ÝÀ¸·Î Á¢¼ÓÇÏ¿© "GET pagename" À» ÀÔ·ÂÇϸé HTML È­ÀÏÀÇ ³»¿ëÀÌ ¿ì¸£¸£ ³ª¿Ã °ÍÀÌ´Ù.

¾î¶»°Ô ½ºÆ®¸² ¼ÒÄÏÀÌ ÀÌÁ¤µµÀÇ Á¤È®ÇÑ Àü¼Û Ç°ÁúÀ» °®Ãß°Ô µÇ´Â°¡? ÀÌ ¼ÒÄÏÀº TCP¸¦ ÀÌ¿ëÇϱ⠶§¹®ÀÌ´Ù. (Transmission Control Protocol, RFC-793¿¡ ¹«Ã´ ÀÚ¼¼ÇÏ°Ô ³ª¿ÍÀÖ´Ù.) ¾Æ¸¶µµ TCP º¸´Ù´Â TCP/IP¸¦ ´õ ¸¹ÀÌ µé¾îºÃÀ» °ÍÀÌ´Ù. ¾ÕºÎºÐÀº ¹Ù·Î ÀÌ TCPÀÌ°í µÞºÎºÐÀÇ IP´Â ÀÎÅÍ³Ý ¶ó¿ìÆÃÀ» ´ã´çÇÏ´Â ÇÁ·ÎÅäÄÝÀÌ´Ù.

±¦Âú±º~ µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀº ¾î¶²°¡? ¿Ö ºñ¿¬°áÀ̶ó°í ÇÏ´ÂÁö? ³»¿ë¿¡ ¹«½¼ °ü·ÃÀÌ ÀÖ´ÂÁö? ¿Ö ½Å·Úµµ°¡ ¶³¾îÁöÁö? »ç½Ç ÀÌ ¼ÒÄÏÀÇ °æ¿ì ´ç½ÅÀÌ µ¥ÀÌÅͱ׷¥À» º¸³½´Ù¸é Á¤È®È÷ µµÂøÇÒ ¼öµµ ÀÖ´Ù. ¶Ç´Â ÆÐŶµéÀÇ ¼ø¼­°¡ ¹Ù²î¾î¼­ µµÂøÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª ¸¸¾à µµÂøÇÑ´Ù¸é ±× ³»¿ëÀº »ç½Ç Á¤È®ÇÑ °ÍÀÌ´Ù.

µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ ¶ÇÇÑ ¶ó¿ìÆÿ¡´Â IP¸¦ ÀÌ¿ëÇÏÁö¸¸ TCP´Â ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù. »ç½ÇÀº UDP(RFC-768)À» ÀÌ¿ëÇÑ´Ù.

¿¬°áÀ» ¾ÈÇϴ°¡? ½ºÆ®¸² ¼ÒÄÏ¿¡¼­Ã³·³ ¿­·ÁÀÖ´Â ¿¬°áÀ» °ü¸®ÇÒ ÇÊ¿ä°¡ ¾ø´Â °ÍÀÌ´Ù. ±×³É µ¥ÀÌÅÍ ÆÐŶÀ» ¸¸µé¾î¼­ ¸ñÀûÁö¿¡ °ü·ÃµÈ IPÇì´õ¸¦ ºÙ¿©¼­ ¹ß¼ÛÇϱ⸸ ÇÏ¸é µÇ´Â °ÍÀÌ´Ù. ¿¬°áÀÌ ÇÊ¿ä¾ø´Ù. º¸Åë tftp³ª bootp ¿¡ »ç¿ëµÇ´Â °ÍÀÌ´Ù.

ÁÁ¾Æ! ±×·¯¸é µ¥ÀÌÅÍ ÆÐŶÀÌ µµÂøÇÏÁö ¾ÊÀ»Áöµµ ¸ð¸£´Â ÀÌ·± °É ¾î¶»°Ô ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇÏÁö? »ç½Ç ÇÁ·Î±×·¥µéÀº UDPÀ§¿¡ ±× ³ª¸§´ë·ÎÀÇ ´ëÃ¥À» °®Ãß°í ÀÖ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¸é tftp°°Àº °æ¿ì¿¡´Â ÇϳªÀÇ ÆÐŶÀ» º¸³½ ÈÄ¿¡ »ó´ëÆíÀÌ Àß ¹Þ¾Ò´Ù´Â ÀÀ´ä ÆÐŶÀÌ ¿Ã¶§±îÁö ±â´Ù¸®´Â °ÍÀÌ´Ù. ¸¸¾à ÀÏÁ¤½Ã°£(¿¹¸¦ µé¸é 5ÃÊ)µ¿¾È ÀÀ´äÀÌ ¾øÀ¸¸é ¸ø¹ÞÀº °ÍÀ¸·Î °£ÁÖÇÏ°í ´Ù½Ã º¸³»°í, ´Ù½Ã º¸³»°í ÀÀ´äÀÌ ÀÖÀ¸¸é ´ÙÀ½ ÆÐŶÀ» º¸³»°í ÇÏ°Ô µÇ´Â°ÍÀÌ´Ù. ÀÌ Àß¹Þ¾Ò´Ù´Â ÀÀ´ä(ACK reply) ¹æ½ÄÀº »ç½Ç SOCK_DGRAMÀ» »ç¿ëÇÒ °æ¿ì ¸Å¿ì Áß¿äÇÏ´Ù.




2.2. ³×Æ®¿öÅ© À̷аú Àú ¾Æ·¡ÀÇ ¾Ë ¼ö ¾ø´Â °Íµé

°£´ÜÈ÷ ÇÁ·ÎÅäÄÝÀÇ ·¹À̾ ´ëÇؼ­ ¾ð±ÞÀ» ÇßÁö¸¸(UDPÀ§¿¡ ³ª¸§´ë·ÎÀÇ ´ëÃ¥ ¾î¼±¸) ÀÌÁ¦´Â ½ÇÁ¦·Î ³×Æ®¿öÅ©°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´Â Áö¸¦ ¾Ë¾Æº¼ ¶§°¡ µÇ¾ú°í ½ÇÁ¦·Î SOCK_DGRAMÀÌ ¾î¶»°Ô ±¸¼ºµÇ´Â Áö¸¦ ¾Ë¾Æº¼ ÇÊ¿ä°¡ ÀÖÀ» °Í°°´Ù. »ç½Ç ÀÌ ÀýÀº ±×³É ³Ñ¾î°¡µµ µÈ´Ù.

¿©·¯ºÐ~ ÀÌÁ¦´Â µ¥ÀÌŸ ĸ½¶È­¿¡ ´ëÇÏ¿© ¹è¿ì°Ú¾î¿ä~ »ç½Ç ÀÌ°ÍÀº ¸Å¿ì Áß¿äÇÏ´Ù. ¾ó¸¶³ª Áß¿äÇÏ³Ä¸é ¿ì¸® Çб³¿¡¼­ ³×Æ®¿öÅ© ÄÚ½º¸¦ Åë°úÇÏ·Á¸é ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÏ´Â »çÇ×À̱⠶§¹®ÀÌ´Ù. (Èì..) ³»¿ëÀº ÀÌ·¸´Ù. µ¥ÀÌÅÍ ÆÐŶÀÌ ¸¸µé¾îÁö¸é ¸ÕÀú ù¹ø° ÇÁ·ÎÅäÄÝ(tftp ÇÁ·ÎÅäÄÝ)¿¡ ÇÊ¿äÇÑ ¸Ó¸®¸»°ú ²¿¸®¸»ÀÌ ºÙ´Â´Ù. ÀÌ·¸°Ô Çѹø ĸ½¶È­µÈ ³»¿ëÀº ´Ù½Ã µÎ¹ø° ÇÁ·ÎÅäÄÝ(UDP)¿¡ °ü·ÃµÈ ¸Ó¸®¸»°ú ²¿¸®¸»ÀÌ ´Ù½Ã ºÙ°Ô µÈ´Ù. ±× ´ÙÀ½¿¡´Â IP, ±× ´ÙÀ½¿¡´Â ¸¶Áö¸·À¸·Î Çϵå¿þ¾î ÀûÀÎ °èÃþÀ¸·Î¼­ ÀÌ´õ³Ý ÇÁ·ÎÅäÄݷΠĸ½¶È­°¡ µÇ´Â °ÍÀÌ´Ù.


´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼­ ÀÌ ÆÐŶÀ» ¹Þ°Ô µÇ¸é Çϵå¿þ¾î°¡ ÀÌ´õ³Ý Çì´õ¸¦ Ç®°í Ä¿³Î¿¡¼­ IP¿Í UDP Çì´õ¸¦ Ç®°í tftp ÇÁ·Î±×·¥¿¡¼­ tftpÇì´õ¸¦ Ç®°í ÇÏ¿© ³¡À¸·Î ¿ø·¡ÀÇ µ¥ÀÌÅ͸¦ ¾ò°Ô µÇ´Â °ÍÀÌ´Ù.

ÀÌÁ¦ µåµð¾î ¾Ç¸í³ôÀº °èÃþÀû ³×Æ®¿öÅ© ¸ðµ¨(Layered Network Model)À» ¾ê±âÇÒ ¶§°¡ µÈ°Í °°´Ù. ÀÌ ¸ðµ¨Àº ´Ù¸¥ ¸ðµ¨µé¿¡ ºñÇؼ­ ³×Æ®¿öÅ©ÀÇ ½Ã½ºÅÛÀ» ±â¼úÇÏ´Â Ãø¸é¿¡¼­ ¸¹Àº ÀÌÁ¡ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¸é ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Â °æ¿ì ´õ ³·Àº °èÃþ¿¡¼­ ¾î¶² ¹°¸®ÀûÀÎ ¹æ½Ä(½Ã¸®¾óÀÎÁö thin ethernetÀÎÁö ¶Ç´Â AUI¹æ½ÄÀÎÁö)À¸·Î Àü´ÞµÇ´Â Áö¿¡ ´ëÇÏ¿© ÀüÇô ½Å°æÀ» ¾²Áö ¾Ê°íµµ ÀÛ¾÷ÀÌ °¡´ÉÇØ Áú ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ½ÇÁ¦ ³×Æ®¿öÅ© Àåºñ³ª ÅäÆú·ÎÁö´Â ¼ÒÄÏ ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â ÀüÇô °ü°è¾ø´Â ºÐ¾ßÀÌ´Ù.

´õÀÌ»ó ¶°µéÁö ¾Ê°í ´ÙÀ½ °èÃþµéÀ» ÀÏ·¯ Áִµ¥ ¸¸ÀÏ ³×Æ®¿öÅ© ÄÚ½º¿¡¼­ ½ÃÇèÀ» º¸°Ô µÉ °æ¿ì¶ó¸é ¿Ü¿ì´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.

  • Application
  • Presentation
  • Session
  • Transport
  • Network
  • Data Link
  • Physical

¹°¸®Àû °èÃþ(Physical layer)´Â Çϵå¿þ¾î(½Ã¸®¾ó, ÀÌ´õ³Ýµî) ÀÌ´Ù. ¾îÇø®ÄÉÀÌ¼Ç °èÃþÀº »ó»óÇÒ ¼ö ÀÖµíÀÌ ¹°¸®Àû °èÃþÀÇ ¹Ý´ëÆí ³¡ÀÌ´Ù. ÀÌ °èÃþÀ» ÅëÇÏ¿© »ç¿ëÀÚ´Â ³×Æ®¿öÅ©¿Í Á¢ÃËÇÏ°Ô µÇ´Â °ÍÀÌ´Ù.

»ç½Ç ÀÌ ¸ðµ¨Àº ÀÚµ¿Â÷ ¼ö¸® ¼³¸í¼­ ó·³ ½ÇÁúÀûÀÎ ¹º°¡¸¦ ÇÒ ¼ö Àֱ⿡´Â ³Ê¹«³ª ÀϹÝÀûÀÎ ¾ê±âÀÌ´Ù. À¯´Ð½ºÀÇ °æ¿ì¸¦ µé¾î º¸´Ù ½ÇÁúÀûÀÎ ¾ê±â¸¦ ÇØ º»´Ù¸é,

  • Application Layer (telnet, ftp, etc.)
  • Host-to-Host Transport Layer (TCP, UDP)
  • Internet Layer (IP and routing)
  • Network Access Layer (was Network, Data Link, and Physical)

ÀÌ·¯ÇÑ °èÃþÀ¸·Î »ìÆì º»´Ù¸é ¾Æ±îÀÇ µ¥ÀÌÅÍ Ä¸½¶È­°¡ °¢°¢ ¾î¶² °èÃþ¿¡ ¼ÓÇÏ´Â °¡¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ÀÌ·¸°Ô ¸¹Àº ÀÛ¾÷ÀÌ ÇϳªÀÇ µ¥ÀÌÅÍ ÆÐŶÀ» ¸¸µå´Âµ¥ µ¿¿øµÇ´Â °ÍÀÌ´Ù. ÀÌ ³»¿ëÀ» ´ç½ÅÀÌ µ¥ÀÌÅÍÀÇ ÆÐŶ ¸Ó¸® ºÎºÐ¿¡ ¸ù¶¥ ŸÀÌÇÎ ÇØ ³Ö¾î¾ß ÇÑ´Ù´Â ¾ê±â´Ù. (¹°·Ð ³ó´ãÀÌ´Ù.) ½ºÆ®¸² ¼ÒÄÏÀÇ °æ¿ì µ¥ÀÌÅ͸¦ ³»º¸³»±â À§ÇØ ÇØ¾ß ÇÒ ÀÏÀº ¿ÀÁ÷ send()¸¦ È£ÃâÇÏ´Â °Í »ÓÀÌ´Ù. µ¥ÀÌÅÍ ±×·¥ÀÇ °æ¿ì¿¡´Â ¿øÇÏ´Â ¹æ½ÄÀ¸·Î µ¥ÀÌÅ͸¦ Çѹø ĸ½¶È­ÇÏ°í (tftp¹æ½Äµî) sendto()·Î º¸³»¹ö¸®¸é µÇ´Â °ÍÀÌ´Ù.Ä¿³ÎÀÌ Àü¼Û°èÃþ°ú ÀÎÅÍ³Ý °èÃþ¿¡ °ü·ÃµÈ ĸ½¶È­¸¦ ÇÏ°í ³ª¸ÓÁö´Â Çϵå¿þ¾î°¡ ÇÑ´Ù. ¾Æ~ ÷´Ü ±â¼ú!!

ÀÌ°ÍÀ¸·Î °£´ÜÇÑ ³×Æ®¿öÅ© ÀÌ·ÐÀº ³¡ÀÌ´Ù. Âü, ¶ó¿ìÆÿ¡ °üÇؼ­ ÇÏ°í ½Í´ø ¾ê±âµéÀ» Çϳªµµ ¾ÈÇß´Ù. Èì, Çϳªµµ ¾ø´Ù. Á¤¸»ÀÌÁö ¶ó¿ìÆÿ¡ °üÇؼ­ Çϳªµµ ¾ê±âÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ¶ó¿ìÅÍ°¡ IPÇì´õ¸¦ ¹þ°Ü³»¼­ ¶ó¿ìÆà Å×À̺íÀ» ÂüÁ¶ÇÏ¿© ¾î¼±¸ Àú¼±¸...¸¸ÀÏ Á¤¸»·Î ¿©±â¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é IP RFC¸¦ ÂüÁ¶ÇÒ °ÍÀÌ¸ç ¸¸¾à °Å±â¿¡ ´ëÇؼ­ Çϳªµµ ¾ËÁö ¸øÇÑ´Ù¸é! »ý¸í¿¡ ÁöÀåÀº ¾ø´Ù.




3. ±¸Á¶Ã¼µé°ú µ¥ÀÌŸ ó¸®

°á±¹Àº ¿©±â±îÁö ¿Ô±º. µåµð¾î ÇÁ·Î±×·¡¹Ö¿¡ °üÇÑ ¾ê±â¸¦ ÇÒ ¶§ÀÌ´Ù. ÀÌ Àý¿¡¼­´Â ½ÇÁ¦·Î ²Ï³ª ÀÌÇØÇϱ⠾î·Á¿î ¼ÒÄÏ ÀÎÅÍÆäÀ̽º¿¡¼­ ¾²ÀÌ´Â ¿©·¯°¡Áö µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ´ëÇÑ ¾ê±â¸¦ ÇÒ ¿¹Á¤ÀÌ´Ù.

¸ÕÀú ½¬¿î°Í. ¼ÒÄÏ ±â¼úÀÚÀÌ´Ù.¼ÒÄÏ ±â¼úÀÚÀÇ µ¥ÀÌÅÍ ÇüÀº
 int

ÀÌ´Ù. ±×³É º¸Åë intÀÌ´Ù. (Á¤¼öÇü)

¹º°¡ Á» ÀÌ»óÇÏ´õ¶óµµ ±×³É Âü°í Àб⠹ٶõ´Ù. ÀÌ°ÍÀº ¾Ë¾Æ¾ß ÇÑ´Ù. Á¤¼ö¿¡´Â µÎ ¹ÙÀÌÆ®°¡ Àִµ¥ »óÀ§ ¹ÙÀÌÆ®°¡ ¾Õ¿¡ Àְųª ¶Ç´Â ÇÏÀ§ ¹ÙÀÌÆ®°¡ ¾Õ¿¡ ÀÖ°Ô µÈ´Ù. ¾ÕÀÇ °æ¿ì°¡ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼­ÀÌ´Ù. ¾î¶² È£½ºÆ®´Â ³»ºÎÀûÀ¸·Î ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼­·Î Á¤¼ö¸¦ ÀúÀåÇÏ´Â °æ¿ìµµ ÀÖÀ¸³ª ¾È±×·± °æ¿ì°¡ ¸¹´Ù. ¸¸ÀÏ NBO¶ó°í ¾ð±ÞµÈ Á¤¼ö°¡ ÀÖ´Ù¸é ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© (htons()ÇÔ¼ö) È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼­·Î ¹Ù²Ù¾î¾ß ÇÑ´Ù. ¸¸¾à ±×·± ¾ð±ÞÀÌ ¾ø´Ù¸é ±×³É ³»¹ö·Á µÖµµ µÈ´Ù.

ù¹ø° ±¸Á¶Ã¼, struct sockaddr. ÀÌ ±¸Á¶Ã¼´Â ¿©·¯°¡Áö ÇüÅÂÀÇ ¼ÒÄÏ ÁÖ¼Ò¸¦ ´ã°ÔµÈ´Ù.
    struct sockaddr {
        unsigned short    sa_family;    /* address family, AF_xxx       */
        char              sa_data[14];  /* 14 bytes of protocol address */
    };

sa_family ´Â ¿©·¯°¡Áö°¡ µÉ ¼ö Àִµ¥, ÀÌ ¹®¼­¿¡¼­´Â ±×Áß¿¡¼­ "AF_INET"ÀÎ °æ¿ì¸¸ ´Ù·ç°Ô µÈ´Ù. sa_data ´Â ¸ñÀûÁöÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£¸¦ °¡Áö°Ô µÈ´Ù. ¾à°£ ºñ½Ç¿ëÀûÀ̱º.

sockaddr ±¸Á¶Ã¼¸¦ ´Ù·ç±â À§Çؼ­´Â ´ÙÀ½°ú °°Àº parallel structure¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ("in"Àº ÀÎÅͳÝÀ» ÀǹÌÇÑ´Ù.)
    struct sockaddr_in {
        short int          sin_family;  /* Address family               */
        unsigned short int sin_port;    /* Port number                  */
        struct in_addr     sin_addr;    /* Internet address             */
        unsigned char      sin_zero[8]; /* Same size as struct sockaddr */
    };

ÀÌ ±¸Á¶Ã¼´Â °¢°¢ÀÇ Ç×À» ÂüÁ¶ÇϱⰡ Á»´õ ½¬¿î °Í °°´Ù. ÁÖÀÇÇÒ Á¡Àº sin_zero¹è¿­Àº sockaddr °ú ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ¸ÂÃß±â À§Çؼ­ ³Ö¾îÁø °ÍÀ̹ǷΠbzero()³ª memset()ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¸ðµÎ 0À¸·Î ä¿öÁ®¾ß ÇÑ´Ù. ¶ÇÇÑ ²Ï Áß¿äÇÑ Á¡Àε¥, ÀÌ ±¸Á¶Ã¼´Â sockaddr ÀÇ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇÏ¿© ÂüÁ¶µÉ ¼ö ÀÖ°í ±× ¹Ý´ëµµ °¡´ÉÇÏ´Ù´Â °ÍÀÌ´Ù. µû¶ó¼­ socket()ÇÔ¼ö°¡ struct sockaddr * ¸¦ ¿øÇÏ´õ¶óµµ struct sockaddr_inÀ» »ç¿ëÇÒ ¼ö ÀÖ°í ¹Ù·Î ÂüÁ¶ÇÒ ¼öµµ ÀÖ´Â °ÍÀÌ´Ù. ¶ÇÇÑ sin_family´Â sa_family¿¡ ´ëÀÀµÇ´Â °ÍÀÌ¸ç ¹°·Ð "AF_INET"·Î ÁöÁ¤µÇ¾î¾ß Çϸç sin_port, sin_addrÀº ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼­·Î µÇ¾î¾ß ÇÏ´Â Á¡ÀÌ Áß¿äÇÑ °ÍÀÌ´Ù.

±×·¯³ª! ¾î¶»°Ô struct in_addr sin_addr Àüü°¡ NBO°¡ µÉ ¼ö Àִ°¡? ÀÌ Áú¹®Àº »ì¾Æ³²Àº °¡Àå ¹½°°Àº À¯´Ï¿ÂÀÎ struct in_addr ¿¡ ´ëÇÑ º¸´Ù ½ÅÁßÇÑ °ËÅä°¡ ÇÊ¿äÇÒ °Í°°´Ù.
    /* Internet address (a structure for historical reasons) */
    struct in_addr {
        unsigned long s_addr; /* that's a 32-bit long, or 4 bytes */
    };

À½.. ÀÌ°ÍÀº À¯´Ï¿Â "À̾ú¾ú"´Ù. ±×·¯³ª ±×·± ½ÃÀýÀº Áö³ª°¬´Ù. ½Ã¿øÇÏ°Ô ¾ø¾îÁ³±º! µû¶ó¼­ ¸¸¾à "ina"¸¦ struct sockaddr_inÇüÀ¸·Î Á¤ÀÇÇØ ³õ¾Ò´Ù¸é ina.sin_addr.s_addr ·Î NBO »óÅÂÀÇ 4¹ÙÀÌÆ® ÀÎÅÍ³Ý ¾îµå·¹½º¸¦ Á¤È®ÇÏ°Ô ÂüÁ¶ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÌ struct in_addr¿¡ ±× ²ûÂïÇÑ À¯´Ï¿ÂÀ» ¾ÆÁ÷µµ »ç¿ëÇÏ°í ÀÖ´õ¶óµµ #defines S ´öºÐ¿¡ À§¿¡ ÇÑ°Í°ú ¸¶Âù°¡Áö·Î Á¤È®ÇÏ°Ô ÂüÁ¶ÇÒ ¼ö´Â ÀÖÀ» °ÍÀÌ´Ù.




3.1. ¼ø¼­ ¹Ù²Ù±â

ÀÌÁ¦ ´ÙÀ½ Àý·Î ¿Ô´Ù. ³×Æ®¿öÅ©¿Í È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼­¿¡ ´ëÇؼ­ ¸»ÀÌ ³Ê¹« ¸¹¾Ò°í ÀÌÁ¦´Â ½ÇÁ¦ ¿òÁ÷ÀÏ ¶§¶ó°í º»´Ù.

ÁÁ´Ù. µÎ°¡Áö ÇüÅÂÀÇ º¯È¯ÀÌ Àִµ¥ Çϳª´Â short(2 ¹ÙÀÌÆ®)¿Í long(4¹ÙÀÌÆ®)ÀÇ °æ¿ìÀÌ´Ù. ÀÌ ÇÔ¼öµéÀº unsignedº¯¼ö¿¡¼­µµ Àß ÀÛµ¿µÈ´Ù. ÀÌÁ¦ shortº¯¼ö¸¦ È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼­¿¡¼­ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼­·Î º¯È¯ÇÏ´Â °æ¿ì¸¦ º¸ÀÚ. È£½ºÆ®ÀÇ h ·Î ½ÃÀÛÇؼ­ to ¸¦ ³Ö°í ³×Æ®¿öÅ©ÀÇ n À» ³ÖÀº ÈÄ shortÀÇ s ¸¦ ³Ö´Â´Ù. ±×·¡¼­ htons()ÀÌ´Ù. (Àбâ´Â È£½ºÆ® Åõ ³×Æ®¿öÅ© ¼îÆ®ÀÌ´Ù.)

³Ê¹« ½¬¿î°¡?

»ç½Ç h,n,s,l ÀÇ ¾î¶² Á¶ÇÕµµ »ç¿ë°¡´ÉÇÏ´Ù. (¹°·Ð ³Ê¹« ¹Ùº¸½º·¯¿î Á¶ÇÕÀ» ÇÏÁö´Â ¾Ê°ÚÁö..¿¹¸¦ µé¾î stolh, ¼îÆ® Åõ ·Õ È£½ºÆ®?? ÀÌ·±°Ç ¾ø´Ù. Àû¾îµµ ÀÌ µ¿³×¿¡¼­´Â¾ø´Ù.) ÀÖ´Â °ÍµéÀº ´ÙÀ½°ú °°´Ù.

  • htons()--"Host to Network Short"
  • htonl()--"Host to Network Long"
  • ntohs()--"Network to Host Short"
  • ntohl()--"Network to Host Long"

¾Æ¸¶µµ ÀÌÁ¦ »ó´çÈ÷ ¸¹ÀÌ ¾Ë°ÔµÈ °Í°°ÀÌ »ý°¢µéÀ» ÇÒ °ÍÀÌ´Ù. "charÀÇ ¹ÙÀÌÆ® ¼ø¼­¸¦ ¾î¶»°Ô ¹Ù²ÙÁö?(¿ªÀÚÁÖ: ÀÌ Áú¹®Àº ¾Æ¸¶ Àǹ̾ø´Â Áú¹®À¸·Î ÇÑ °Í °°Àºµ¥ ´äµµ ¾ø°í ´õÀÌ»óÀÇ ¾ð±ÞÀÌ ¾ø´Â °ÍÀ¸·Î º¸¾Æ »©°í ½ÍÀº ºÎºÐÀÌ´Ù.)" ¶Ç´Â "¿°·Á¸¶, ³»°¡ ¾²´Â 68000 ±â°è´Â ÀÌ¹Ì ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼­·Î Á¤¼ö¸¦ ÀúÀåÇÏ´Ï±î º¯È¯ÇÒ ÇÊ¿ä´Â ¾ø¾î " ¶ó°í »ý°¢ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ²À ±×·¸Áö¸¸Àº ¾Ê´Ù. ±×·¸°Ô ÀÛ¼ºµÈ ÇÁ·Î±×·¥À» ´Ù¸¥ ±â°è¿¡¼­ ÀÛµ¿½ÃŲ´Ù¸é ´ç¿¬È÷ ¹®Á¦°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù. ¿©±â´Â À¯´Ð½º ¼¼°è°í À̱âÁ¾°£ÀÇ È£È¯¼ºÀº ¸Å¿ì Áß¿äÇÑ °ÍÀÌ´Ù. ¹Ýµå½Ã ³×Æ®¿öÅ©¿¡ µ¥ÀÌÅ͸¦ º¸³»±â Àü¿¡ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼­·Î ¹Ù²ã¼­ º¸³½´Ù´Â °ÍÀ» ±â¾ïÇÒ Áö¾î´Ù.

³¡À¸·Î sin_addr, sin_port´Â ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¼ø¼­·Î ±â·ÏÇϴµ¥ ¿Ö sin_family´Â ¾È ±×·¯´Â°¡? ´äÀº °£´ÜÇÏ´Ù. sin_addr°ú sin_port´Â ĸ½¶È­µÇ¾î ³×Æ®¿öÅ©·Î Àü¼ÛµÇ¾î¾ß ÇÏ´Â º¯¼öÀÎ °ÍÀÌ´Ù. µû¶ó¼­ ´ç¿¬È÷ NBO¿©¾ß ÇÑ´Ù. ±×·¯³ª sin_family´Â ½Ã½ºÅÛ ³»ºÎ¿¡¼­ Ä¿³Î¿¡ ÀÇÇؼ­¸¸ »ç¿ëµÇ´Â º¯¼öÀÌ¸ç ³×Æ®¿öÅ©·Î Àü¼ÛµÇÁö ¾Ê´Â °ÍÀ̹ǷΠȣ½ºÆ® ¹ÙÀÌÆ® ¼ø¼­·Î ±â·ÏµÇ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù.




3.2. IPÁÖ¼Ò´Â ¹«¾ùÀÌ¸ç ¾î¶»°Ô ´Ù·ç´Â°¡?

´ÙÇེ·´°Ôµµ IPÁÖ¼Ò¸¦ »êÁ¤ÇØ ÁÖ´Â ¼ö¸¹Àº ÇÔ¼öµéÀÌ ÀÖÀ¸¸ç µû¶ó¼­ 4¹ÙÀÌÆ®ÀÇ longº¯¼ö¿¡ Á÷Á¢ °è»êÇؼ­ << ¿¬»êÀÚ¸¦ ÀÌ¿ëÇؼ­ Áý¾î³Ö¾î¾ß ÇÏ´Â ¼ö°í´Â ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

¸ÕÀú struct sockaddr_IN ina°¡ Á¤ÀǵǾî ÀÖ°í 132.241.5.10 ÀÌ IP ÁÖ¼ÒÀ̸ç ÀÌ °ªÀ» º¯¼ö¿¡ ³Ö¾î¾ß ÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ. inet_addr()ÇÔ¼ö°¡ ¹Ù·Î ÀÌ·²¶§ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ±× ÇÔ¼ö´Â ¼ýÀÚ¿Í Á¡À¸·Î ±¸¼ºµÈ IPÁÖ¼Ò¸¦ unsigned long º¯¼ö¿¡ Áý¾î ³Ö¾î ÁØ´Ù. ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.
ina.sin_addr.s_addr = inet_addr("132.241.5.10")
inet_addr()´Â °á°ú°ªÀ¸·Î ÀÌ¹Ì NBOÀÎ °ªÀ» µ¹·ÁÁÖ¸ç ±»ÀÌ htonl()À» ¶Ç »ç¿ëÇÒ ÇÊ¿ä´Â ¾ø´Ù´Â Á¡¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¸ÚÁö±º!

±×·¯³ª À§ÀÇ Â©¸·ÇÑ ÄÚµå´Â ±×·¸°Ô °ß½ÇÇØ º¸ÀÌÁø ¾Ê´Â´Ù. ¿Ö³ÄÇϸé inet_addr()Àº ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ°Ô µÇ¸ç unsigned long¿¡¼­ -1Àº 255.255.255.255¸¦ ÀǹÌÇÑ´Ù. ÀÌ´Â ÀÎÅÍ³Ý ºê·Îµåij½ºÆ® ¾îµå·¹½º°¡ µÈ´Ù. ³ª»Û ³à¼®. Ç×»ó ¿¡·¯ 󸮸¦ È®½ÇÈ÷ Çϴ°ÍÀÌ ÁÁ´Ù.

ÁÁ´Ù. ÀÌÁ¦ IPÁÖ¼Ò¸¦ long¿¡ ³Ö´Â°ÍÀº ¾Ë¾Ò´Âµ¥ ±× ¹Ý´ë´Â ¾î¶»°Ô ÇÒ °ÍÀΰ¡? ¸¸¾à¿¡ °ªÀÌ µé¾îÀÖ´Â struct in_addrÀº °¡Áö°í Àִµ¥ À̸¦ ¼ýÀÚ¿Í Á¡À¸·Î Ç¥½ÃÇÏ·Á¸é? ÀÌ °æ¿ì´Â inet_ntoa()¸¦ ¾²¸é µÈ´Ù.(ntoa ´Â ³×Æ®¿öÅ© Åõ ¾Æ½ºÅ°ÀÌ´Ù.)
    printf("%s",inet_ntoa(ina.sin_addr));

À§ÀÇ ÄÚµå´Â IPÁÖ¼Ò¸¦ ÇÁ¸°Æ® ÇØ ÁÙ°ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â long º¯¼ö°¡ ¾Æ´Ï¶ó struct in_addr ¸¦ º¯¼ö·Î ¹Þ¾Æ µéÀδٴ Á¡À» ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼ö´Â char ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ °á°ú·Î µ¹·Á Áִµ¥ ÀÌ´Â ÇÔ¼ö³»¿¡ static ÇÑ °ø°£¿¡ ÀúÀåµÇ¸ç µû¶ó¼­ ¸Å¹ø ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù ÀÌ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â °÷ÀÇ °ªÀº º¯È­ÇÑ´Ù´Â °ÍÀÌ´Ù. Áï ¿¹¸¦ µé¸é,
    char *a1, *a2;
    .
    .
    a1 = inet_ntoa(ina1.sin_addr);  /* this is 198.92.129.1 */
    a2 = inet_ntoa(ina2.sin_addr);  /* this is 132.241.5.10 */
    printf("address 1: %s\n",a1);
    printf("address 2: %s\n",a2);

ÀÇ Ãâ·ÂÀº ÀÌ·¸°Ô ³ª¿Ã °ÍÀÌ´Ù.
    address 1: 132.241.5.10
    address 2: 132.241.5.10

¸¸¾à¿¡ ÀÌ °ªÀ» ÀúÀåÇØ¾ß ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù¸é strcpy()¸¦ ÀÌ¿ëÇÏ¿© °íÀ¯ÀÇ char ¹è¿­¿¡ ÀúÀåÇØ¾ß ÇÒ °ÍÀÌ´Ù.

ÀÌÀý¿¡¼­ ¾ê±âÇÒ °ÍÀº ´Ù Çß´Ù. ³ªÁß¿¡ "whitehouse.gov" ¹®ÀÚ¿­À» ÇØ´çÇÏ´Â IPÁÖ¼Ò·Î ¹Ù²Ù´Â ¹ýÀ» ¾Ë·Á ÁÙ°ÍÀÌ´Ù. (DNSÀý ÂüÁ¶)




4. ½Ã½ºÅÛ ÄÝ

4.1. socket() ; ÆÄÀÏ ±â¼úÀÚ¸¦ Àâ¾Æ¶ó

¾ÈÇÏ¸é ¸ÂÀ»°Í °°¾Æ¼­ socket() ½Ã½ºÅÛ È£Ãâ¿¡ ´ëÇؼ­ ¾ê±âÇؾ߸¸ ÇÒ°Í°°´Ù. ÀÌ°É Àá±ñ º¸ÀÚ.
    #include <sys/types.h> 
    #include <sys/socket.h> 

    int socket(int domain, int type, int protocol);

±×·±µ¥ ÀÌ º¯¼öµéÀº ¶Ç ¹º°¡? ù° domain Àº struct sockaddr_in ¿¡¼­Ã³·³ AF_INET ·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. ´ÙÀ½ type Àº SOCK_STREAMÀ̳ª SOCK_DGRAMÀ¸·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. ³¡À¸·Î protocolÀº 0À¸·Î ÁöÁ¤ÇÏ¸é µÈ´Ù. (¾ð±ÞÇÏÁö ¾Ê¾ÒÁö¸¸ ´õ ¸¹Àº domain°ú ´õ ¸¹Àº type ÀÌ ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇ϶ó. socket() ¸ÇÆäÀÌÁö¸¦ Âü°íÇÏ°í ¶ÇÇÑ protocol ¿¡ ´ëÇؼ­ Á»´õ ¾Ë·Á¸é getprotobyname()À» ÂüÁ¶ÇÏ¸é µÈ´Ù.)

socket()Àº ¹Ù·Î ³ªÁß¿¡ »ç¿ëÇÒ ¼ÒÄÏ ±â¼úÀÚÀÎ Á¤¼ö°ªÀ» µ¹·ÁÁÖ¸ç ¿¡·¯½Ã¿¡´Â -1À» µ¹·ÁÁÖ°Ô µÈ´Ù. Àü¿ªº¯¼öÀÎ errno¿¡ ¿¡·¯°ªÀÌ ±â·ÏµÈ´Ù. (perror()ÀÇ ¸ÇÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ°Í.)




4.2. bind() ; ³ª´Â ¾î¶² Æ÷Æ®¿¡ ¿¬°áµÇ¾ú³ª?

ÀÏ´Ü ¼ÒÄÏÀ» ¿­°Ô µÇ¸é ÀÌ ¼ÒÄÏÀ» ÇöÀç ½Ã½ºÅÛÀÇ Æ÷Æ®¿¡ ¿¬°á½ÃÄÑ ÁÖ¾î¾ß ÇÑ´Ù. (ÀÌ ÀÛ¾÷Àº º¸Åë listen()ÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ¿ÜºÎÀÇ Á¢¼ÓÀ» ´ë±âÇÒ ¶§ ½ÃÇàµÇ¸ç ÀϹÝÀûÀ¸·Î ¸Óµå°ÔÀÓ »çÀÌÆ®µéÀÌ telnet *.*.*.* 6969 ·Î Á¢¼ÓÇ϶ó°í ÇÒ¶§µµ ÀÌ ÀÛ¾÷À» ½ÃÇàÇß´Ù´Â ÀǹÌÀÌ´Ù. ) ¸¸¾à¿¡ ±×Àú ´Ù¸¥ È£½ºÆ®¿¡ ¿¬°áÇϱ⸸ ÇÒ ¿¹Á¤À̶ó¸é ±×³É connect()¸¦ »ç¿ëÇÏ¿© ¿¬°á¸¸ ÇÏ¸é µÇ°í ÀÌ ÀÛ¾÷Àº ÇÊ¿ä°¡ ¾ø´Ù.

¾Æ·¡´Â bind() ½Ã½ºÅÛ È£ÃâÀÇ ¼±¾ðÀÌ´Ù.
    #include <sys/types.h> 
    #include <sys/socket.h> 

    int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

sockfd´Â socket()ÇÔ¼ö¿¡¼­ ¾òÀº ¼ÒÄÏ ±â¼úÀÚÀ̸ç my_addrÀº IP ÁÖ¼Ò¿¡ °üÇÑ Á¤º¸(Áï, IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£)¸¦ ´ã°í ÀÖ´Â struct sockaddr ¿¡ ´ëÇÑ Æ÷ÀÎÅÍ ÀÌ°í addrlenÀº ±× ±¸Á¶Ã¼ÀÇ »çÀÌÁî(sizeof(struct sockaddr))ÀÌ´Ù.

ÈÞ~~ Çѹ濡 ¹Þ¾ÆµéÀ̱⿡´Â Á» ±×·¸±º. ¿¹¸¦ º¸ÀÚ.
    #include <string.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 

    #define MYPORT 3490

    main()
    {
        int sockfd;
        struct sockaddr_in my_addr;

        sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */

        my_addr.sin_family = AF_INET;     /* host byte order */
        my_addr.sin_port = htons(MYPORT); /* short, network byte order */
        my_addr.sin_addr.s_addr = inet_addr("132.241.5.10");
        bzero(&(my_addr.sin_zero), 8);    /* zero the rest of the struct */

        /* don't forget your error checking for bind(): */
        bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
        .
        .
        .

¸î°¡Áö ÁÖÀÇÇÒ Á¡Àº my_addr.sin_port ´Â my_addr.sin_addr.s_addr°ú °°ÀÌ NBOÀÌ´Ù. ¶ÇÇÑ Çì´õÈ­ÀÏÀº °¢°¢ÀÇ ½Ã½ºÅÛ¸¶´Ù ´Ù¸¦ ¼ö ÀÖÀ¸¹Ç·Î °¢ÀÚÀÇ ½Ã½ºÅÛÀÇ ¸Ç ÆäÀÌÁö¸¦ Âü°íÇØ¾ß ÇÒ °ÍÀÌ´Ù.

¸¶Áö¸·À¸·Î bind()¿Í °ü·ÃÇؼ­ ÁÖ¼Ò³ª Æ÷Æ®ÀÇ ÁöÁ¤ÀÌ ¶§¿¡ µû¶ó¼­ ÀÚµ¿È­ µÉ ¼öµµ ÀÖ´Ù´Â °ÍÀ» ¾ð±ÞÇØ¾ß ÇÒ °Í°°´Ù.
        my_addr.sin_port = 0; /* choose an unused port at random */
        my_addr.sin_addr.s_addr = INADDR_ANY;  /* use my IP address */

my_addr.sin_port¸¦ 0À¸·Î ÁöÁ¤Çϸé ÀÚµ¿À¸·Î »ç¿ëµÇÁö ¾Ê°í ÀÖ´Â Æ÷Æ® ¹øÈ£¸¦ ÁöÁ¤ÇØ ÁÙ°ÍÀ̸ç my_addr.sin_addr.s_addr¸¦ INADDR_ANY·Î ÁöÁ¤ÇÒ °æ¿ì ÇöÀç ÀÛµ¿µÇ°í ÀÖ´Â ÀÚ½ÅÀÇ IPÁÖ¼Ò¸¦ ÀÚµ¿À¸·Î ÁöÁ¤ÇØ ÁÖ°Ô µÈ´Ù.

¸¸¾à ¿©±â¼­ ¾à°£¸¸ ÁÖÀǸ¦ ±â¿ï¿´´Ù¸é INADDR_ANY¸¦ ÁöÁ¤ÇÒ ¶§ NBO·Î ¹Ù²Ù´Â °ÍÀ» »©¸ÔÀº °ÍÀ» ´«Ä¡Ã§ °ÍÀÌ´Ù. ³ª¾Æ»Û~~. ±×·¯³ª ³­ ³»ºÎÁ¤º¸¸¦ ¾Ë°í ÀÖÁö·Õ. »ç½ÇÀº INADDR_ANY´Â 0ÀÌ´Ù. 0Àº ¼ø¼­¸¦ ¹Ù²Ù¾îµµ 0ÀΰÍÀÌ´Ù. ±×·¯³ª ¼ø¼öÀÌ·ÐÀûÀÎ Ãø¸é¿¡¼­ INADDR_ANY°¡ ±×·¯´Ï±î 12Á¤µµÀÎ ¼¼°è°¡ Á¸ÀçÇÑ´Ù¸é ÀÌ ÄÚµå´Â ÀÛµ¿ ¾ÈÇÒ°ÍÀÌ´Ù. ±×·¡¼­? ³­ »ó°ü¾ø´Ù. Á¤ ±×·¸´Ù¸é,
        my_addr.sin_port = htons(0); /* choose an unused port at random */
        my_addr.sin_addr.s_addr = htonl(INADDR_ANY);  /* use my IP address */

ÀÌÁ¦´Â ¹Ï±â ¾î·Á¿ï Á¤µµ·Î À̽İ¡´ÉÇÑ Äڵ尡 µÇ¾ú´Ù. ´Ù¸¸ ÁöÀûÇÏ°í ½ÍÀº °ÍÀº ÀÛµ¿ÇÏ´Â µ¥¿¡´Â ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù´Â Á¡ÀÌ´Ù.

bind()¶ÇÇÑ ¿¡·¯°¡ ³µÀ»¶§ -1À» µ¹·ÁÁÖ¸ç errno¿¡ ¿¡·¯ÀÇ Äڵ尡 ³²°Ô µÈ´Ù.

bind()¸¦ È£ÃâÇÒ ¶§ ÁÖÀÇÇÒÁ¡ : Àý´ë Á¦ÇѼ± ¾Æ·¡·Î Æ÷Æ®¹øÈ£¸¦ ³»¸®Áö ¸»¶ó´Â °ÍÀÌ´Ù. 1024 ¾Æ·¡ÀÇ ¹øÈ£´Â ¸ðµÎ ¿¹¾àµÇ¾î ÀÖ´Ù. ±× À§·Î´Â 65535±îÁö ¿øÇÏ´Â ´ë·Î ¾µ ¼ö°¡ ÀÖ´Ù. (´Ù¸¥ ÇÁ·Î±×·¥ÀÌ ¾²°í ÀÖÁö ¾ÊÀº °æ¿ì¿¡ ÇÑÇؼ­..)

¶Ç ÇϳªÀÇ ÀÛÀº ²¿¸®¸» : bind() ¸¦ È£ÃâÇÏÁö ¾Ê¾Æµµ µÇ´Â °æ¿ì°¡ ÀÖ´Ù. ¸¸ÀÏ ´Ù¸¥ È£½ºÆ®¿¡ ¿¬°á (connect())ÇÏ°íÀÚ ÇÏ´Â °æ¿ì¿¡´Â ÀÚ½ÅÀÇ Æ÷Æ®¿¡´Â (ÅÚ³ÝÀÇ °æ¿ìó·³)ÀüÇô ½Å°æ ¾µ ÇÊ¿ä°¡ ¾ø´Ù. ´ÜÁö connect()¸¦ È£ÃâÇϱ⸸ ÇÏ¸é ¾Ë¾Æ¼­ bind°¡ µÇ¾î ÀÖ´ÂÁö¸¦ üũÇؼ­ ºñ¾îÀÖ´Â Æ÷Æ®¿¡ bind¸¦ ÇØÁØ´Ù.




4.3. connect() ; ¾îÀÌ~ °Å±â~

ÀÌÁ¦ Àá±ñ¸¸ ¸¶Ä¡ ÀÚ½ÅÀÌ ÅÚ³Ý ÇÁ·Î±×·¥ÀÎ °Íó·³ »ý°¢ÇØ º¸±â·Î ÇÏÀÚ. ´ç½ÅÀÇ »ç¿ëÀÚ´Â ¸í·ÉÇϱ⸦ (TRON¿µÈ­¿¡¼­Ã³·³.. (¿ªÀÚ: ³­ ±× ¿µÈ­ ¾È ºÃ´Âµ¥..)) ¼ÒÄÏ ±â¼úÀÚ¸¦ ¾ò¾î¿À¶ó Çß°í ´ç½ÅÀº Áï½Ã socket()¸¦ È£ÃâÇß´Ù. ´ÙÀ½¿¡ »ç¿ëÀÚ´Â 132.241.5.10 ¿¡ Æ÷Æ® 23(Á¤±Ô ÅÚ³Ý Æ÷Æ®¹øÈ£)¿¡ ¿¬°áÇ϶ó°í ÇÑ´Ù. À¹, ÀÌÁ¨ ¾î¶»°Ô ÇÏÁö?

´ÙÇེ·´°Ôµµ ´ç½Å(ÇÁ·Î±×·¥)Àº connect()Àý(¾î¶»°Ô ¿¬°áÇϴ°¡)¸¦ ½É°¢ÇÏ°Ô Àаí ÀÖÀ¸¸ç ´ç½ÅÀÇ ÁÖÀÎÀ» ½Ç¸Á½ÃÅ°Áö ¾ÊÀ¸·Á°í ¹ÌÄ£µíÀÌ Àо°¡´Â ÁßÀ̷δÙ~~

connet()´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù.
    #include <sys/types.h> 
    #include <sys/socket.h> 

    int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

sockfd´Â ÀÌÁ¦´Â Ä£¼÷ÇØÁø ¼ÒÄÏ ±â¼úÀÚÀ̸ç serv_addrÀº ¿¬°áÇÏ°íÀÚ ÇÏ´Â ¸ñÀûÁöÀÎ ¼­¹öÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¿¡ °üÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â struct sockaddr À̸ç addrlenÀº ¾Õ¿¡¼­ À̾߱â ÇÑ°Í°ú °°ÀÌ ±× ±¸Á¶Ã¼ÀÇ Å©±âÀÌ´Ù.

¹º°¡ Á» ÀÌÇØ°¡ °¥ µí ÇÏÁö ¾ÊÀº°¡? ¿¹¸¦ µé¾î º¸ÀÚ.
    #include <string.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 

    #define DEST_IP   "132.241.5.10"
    #define DEST_PORT 23

    main()
    {
        int sockfd;
        struct sockaddr_in dest_addr;   /* will hold the destination addr */

        sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */

        dest_addr.sin_family = AF_INET;        /* host byte order */
        dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */
        dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
        bzero(&(dest_addr.sin_zero), 8);       /* zero the rest of the struct */

        /* don't forget to error check the connect()! */
        connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
        .
        .
        .

´Ù½Ã ¸»Çϰǵ¥ connect()ÀÇ °á°ú°ªÀ» Çѹø üũÇØ ºÁ¾ß ÇÑ´Ù. ¿¡·¯ÀÏ °æ¿ì -1À» µ¹·ÁÁÖ°í errno¸¦ ¼¼ÆÃÇϱ⠶§¹®ÀÌ´Ù.

¶ÇÇÑ bind()¸¦ È£ÃâÇÏÁö ¾ÊÀº °Í¿¡ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¿©±â¼­´Â ÀÚ½ÅÀÇ Æ÷Æ® ¹øÈ£¿¡´Â °áÄÚ °ü½ÉÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ´ÜÁö ¾îµð·Î °¡´Â°¡¸¸ÀÌ Áß¿äÇÏ´Ù. Ä¿³ÎÀÌ ¾Ë¾Æ¼­ ·ÎÄà Æ÷Æ®¸¦ ¼±Á¤ÇØ ÁÙ °ÍÀÌ¸ç ¿ì¸®°¡ ¿¬°áÇÏ°íÀÚ ÇÏ´Â °÷¿¡¼­´Â ÀÚµ¿À¸·Î ÀÌ Á¤º¸¸¦ ¾Ë°Ô µÉ °ÍÀÌ´Ù.




4.4. listen() ; ´©°¡ ÀüÈ­ Á» °É¾îÁÖÁö~

ÀÌÁ¦ º¸Á¶¸¦ ¹Ù²Ù¾î¼­, ¸¸¾à¿¡ ¾îµð·Ð°¡ ¿¬°áÇÏ°íÀÚ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¿ÜºÎ·ÎºÎÅÍÀÇ Á¢¼ÓÀ» ´ë±âÇؼ­ Á¢¼ÓÀÌ ¿Ã °æ¿ì ¾î¶² ¹æ½ÄÀ¸·ÎµçÁö °£¿¡ 󸮸¦ ÇØ ÁÖ¾î¾ß ÇÏ´Â °æ¿ì¶ó¸é ¾îÂî ÇÒ °ÍÀΰ¡. ÀÌ ÀÛ¾÷Àº µÎ ´Ü°è·Î ÀÌ·ç¾îÁø´Ù. ¸ÕÀú listen()À» ÇØ¾ß µÇ°í ±× ´ÙÀ½¿¡ accept()¸¦ ÇØ¾ß µÈ´Ù´Â °ÍÀÌ´Ù.

listen()Àº »ó´çÈ÷ °£´ÜÇÏÁö¸¸ ¾à°£ÀÇ ¼³¸íÀº ÇÊ¿äÇÏ´Ù.
    int listen(int sockfd, int backlog);

sockfd´Â º¸ÅëÀÇ ¼ÒÄÏ ±â¼úÀÚÀ̸ç backlog´Â Á¢¼Ó´ë±â Å¥ÀÇ ÃÖ´ë ¿¬°á °¡´É ¼ýÀÚÀÌ´Ù. ±×°Ç ¶Ç ¹º ¾ê±âÀΰ¡? ¿ÜºÎ·ÎºÎÅÍÀÇ ¿¬°áÀº ÀÌ ´ë±â Å¥¿¡¼­ accept()°¡ È£ÃâµÉ ¶§±îÁö ±â´Ù·Á¾ß ÇÑ´Ù´Â °ÍÀÌ¸ç ¼ýÀÚ´Â ¹Ù·Î ¾ó¸¶³ª ¸¹Àº Á¢¼ÓÀÌ ÀÌ Å¥¿¡ ½×¿©Áú ¼ö Àִ°¡ ÇÏ´Â °ÍÀÌ´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛÀº ÀÌ ¼ýÀÚ¸¦ Á¶¿ëÇÏ°Ô 20Á¤µµ¿¡¼­ Á¦ÇÑÇÏ°í ÀÖÀ¸¸ç º¸ÅëÀº 5¿¡¼­ 10 »çÀÌ·Î ÁöÁ¤ÇÏ°Ô µÈ´Ù.

¶Ç ´Ù½Ã listen()µµ ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ¸ç errno¸¦ ¼¼ÆÃÇÑ´Ù.

¾Æ¸¶ »ó»óÇÒ ¼ö ÀÖµíÀÌ listen()º¸´Ù ¾Õ¼­¼­ bind()¸¦ È£ÃâÇØ¾ß ÇÏ¸ç ¸¸¾à¿¡ bind()°¡ µÇÁö ¾ÊÀ¸¸é ¿ì¸®´Â ·£´ýÇÏ°Ô ÁöÁ¤µÈ Æ÷Æ®¿¡¼­ ¿ÜºÎÀÇ Á¢¼ÓÀ» ±â´Ù·Á¾ß ÇÑ´Ù. (Æ÷Æ®¸¦ ¸ð¸£°í¼­ ´©°¡ Á¢¼ÓÇÒ ¼ö Àְڴ°¡? ¿ì¿¢~~) µû¶ó¼­ ¿ÜºÎÀÇ Á¢¼ÓÀ» ±â´Ù¸®´Â °æ¿ì¶ó¸é ´ÙÀ½ ¼ø¼­´ë·Î ÀÛ¾÷ÀÌ ÁøÇàµÇ¾î¾ß ÇÏ´Â °ÍÀÌ´Ù.
    socket();
    bind();
    listen();
    /* accept() goes here */

À§ÀÇ °Í¸¸À¸·Îµµ ÀÌÇØ°¡ °¥¸¸ÇÏ´Ù°í º¸°í ¿¹Á¦¿¡ ´ë½ÅÇÏ°Ú´Ù. (accept()Àý¿¡ º¸´Ù ±¦ÂúÀº Äڵ尡 ÁغñµÇ¾î ÀÖ´Ù.) ÀÌ ¸ðµç sha-bang(¿ªÀÚ: ÀÌ ¹¹²¿?)Áß¿¡¼­ °¡Àå Çò°¥¸®´Â ºÎºÐÀº accept()¸¦ ºÎ¸£´Â ºÎºÐÀÌ´Ù.




4.5. accept() ; Æ÷Æ® 3490¿¡ ÀüÈ­°É¾îÁּż­ °¨»çÇÕ´Ï´Ù.

Áغñ! accept()¸¦ È£ÃâÇÏ´Â °ÍÀº ¹º°¡ Á» ¼ö»óÇϱä ÇÏ´Ù. °ú¿¬ ¹¹°¡ ¹ú¾îÁö´Â°¡? Àú ¸Ö¸® ¶³¾îÁø °÷¿¡¼­ ´©±º°¡°¡ connect()¸¦ È£ÃâÇÏ¿© ´ç½ÅÀÌ listen()À» È£ÃâÇÏ°í ±â´Ù¸®´Â Æ÷Æ®¿¡ Á¢¼ÓÀ» ½ÃµµÇÑ´Ù. ±×µéÀÇ ¿¬°áÀº ¹Ù·Î accept()°¡ È£ÃâµÇ±â ±îÁö Å¥¿¡¼­ ¹Ù·Î ´ç½ÅÀÌ accept()¸¦ È£ÃâÇÏ¿© ±× ¿¬°áÀ» Áö¼ÓÇ϶ó°í ¸í·ÉÇÒ ¶§±îÁö ´ë±âÇÏ°Ô µÈ´Ù. ±×·¯¸é ÀÌ ÇÔ¼ö´Â ¿À·ÎÁö ÀÌ ¿¬°áÀ» À§ÇÑ ¿ÏÀüÈ÷ ½ÅÁ¦Ç° ¼ÒÄÏ ÆÄÀÏ ±â¼úÀÚ¸¦ µ¹·ÁÁÖ°Ô µÈ´Ù. °©Àڱ⠴ç½ÅÀº Çϳª°ªÀ¸·Î µÎ°³ÀÇ ¼ÒÄÏ ±â¼úÀÚ¸¦ °®°Ô µÇ´Â °ÍÀÌ´Ù. ¿ø·¡ÀÇ °ÍÀº ¾ÆÁ÷µµ ±× Æ÷Æ®¿¡¼­ ¿¬°áÀ» listen()ÇÏ°í ÀÖ´Ù. ¶Ç Çϳª´Â »õ·Ó°Ô âÁ¶µÇ¾î µåµð¾î send()¿Í recv()¸¦ ÇÒ Áغñ°¡ µÇµµ·Ï ÇÏ´Â °ÍÀÌ´Ù.

µåµð¾î ¿©±â±îÁö ¿Ô´Ù! °¨°Ý~~

¼±¾ðÀº ¾Æ·¡¿Í °°´Ù.
     #include <sys/socket.h> 

     int accept(int sockfd, void *addr, int *addrlen);

sockfd´Â listen()ÇÏ°í ÀÖ´Â ¼ÒÄÏÀÇ ±â¼úÀÚÀÌ´Ù. »·ÇÏÁö ¹¹.. addrÀº ·ÎÄà struct sockaddr_inÀÇ Æ÷ÀÎÅÍÀÌ´Ù. ¿©±â¿¡ µé¾î¿Â Á¢¼Ó¿¡ °üÇÑ Á¤º¸°¡ ´ã°ÜÁö°Ô µÇ°í À̸¦ ÀÌ¿ëÇؼ­ ¾î´À È£½ºÆ®¿¡¼­ ¾î´À Æ÷Æ®¸¦ ÀÌ¿ëÇؼ­ Á¢¼ÓÀÌ µé¾î¿Ô´ÂÁö¸¦ ¾Ë ¼ö ÀÖ°Ô µÈ´Ù. addrlenÀº ·ÎÄà Á¤¼ö º¯¼öÀ̸ç ÀÌ Á¤¼ö¿¡´Â struct sockaddr_inÀÇ Å©±â°¡ ¹Ì¸® ÁöÁ¤µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ¼ýÀÚº¸´Ù ´õ ¸¹Àº ¹ÙÀÌÆ®ÀÇ Á¤º¸°¡ µé¾î¿À¸é accept()´Â ¹Þ¾Æ µéÀÌÁö ¾ÊÀ» °ÍÀ̸ç Àûµ¥ µé¾î¿Â´Ù¸é addrlenÀÇ °ªÀ» ÁÙ¿© ÁÙ °ÍÀÌ´Ù.

accept() ´Â ¿¡·¯°¡ ³µÀ» °æ¿ì¿¡ ¾î¶»°Ô ÇÑ´Ù°í? -1À» µ¹·ÁÁÖ°í errno ¸¦ ¼¼ÆÃÇÑ´Ù.

¾Æ±î ¸ÇÄ¡·Î Çѹ濡 ¹Þ¾ÆµéÀ̱⿡´Â Á» ±×·¯´Ï±î ¿¹Á¦¸¦ ¿­½ÉÈ÷ ÀÐ¾î º¸ÀÚ.
    #include <string.h> 
    #include <sys/types.h> 
    #include <sys/socket.h> 

    #define MYPORT 3490    /* the port users will be connecting to */

    #define BACKLOG 10     /* how many pending connections queue will hold */

    main()
    {
        int sockfd, new_fd;  /* listen on sock_fd, new connection on new_fd */
        struct sockaddr_in my_addr;    /* my address information */
        struct sockaddr_in their_addr; /* connector's address information */
        int sin_size;

        sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */

        my_addr.sin_family = AF_INET;         /* host byte order */
        my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
        my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
        bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */

        /* don't forget your error checking for these calls: */
        bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));

        listen(sockfd, BACKLOG);

        sin_size = sizeof(struct sockaddr_in);
        new_fd = accept(sockfd, &their_addr, &sin_size);
        .
        .
        .

ÀÌÁ¦ new_fd¸¦ ÀÌ¿ëÇؼ­ send()¿Í recv()¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¸¸¾à ¿øÇÑ´Ù¸é ´õÀÌ»óÀÇ ¿¬°áÀ» ¹Þ¾ÆµéÀÌÁö ¾Ê°í ÇϳªÀÇ ¿¬°á¸¸ ÀÌ¿ëÇϱâ À§Çؼ­ close()¸¦ ÀÌ¿ëÇÏ¿© ¿ø·¡ÀÇ sockfd¸¦ ¸·¾Æ ¹ö¸± ¼öµµ ÀÖ´Ù.




4.6. send(), recv() ; ¸» Á» ÇغÁ~

ÀÌ µÎ ÇÔ¼ö´Â ½ºÆ®¸² ¼ÒÄÏÀ̳ª ¿¬°áµÈ µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ§¿¡¼­ Á¤º¸¸¦ ÁÖ°í ¹ÞÀ»¶§ »ç¿ëÇÏ´Â °ÍµéÀÌ´Ù. ¸¸¾à º¸ÅëÀÇ ºñ¿¬°á µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ» »ç¿ëÇÑ´Ù¸é sendto()¿Í recvfrom()ÀýÀ» ÂüÁ¶Çϵµ·Ï ÇÑ´Ù.

send() È£ÃâÀÇ ¼±¾ðÀº ¾Æ·¡¿Í °°´Ù.
    int send(int sockfd, const void *msg, int len, int flags);

sockfd´Â socket()¸¦ ÅëÇؼ­ ¾ò¾ú°Å³ª accept()¸¦ ÅëÇؼ­ »õ·Î ±¸ÇÑ, µ¥ÀÌÅ͸¦ º¸³¾ ¼ÒÄÏÀÇ ±â¼úÀÚÀ̸ç, msg´Â º¸³¾ µ¥ÀÌÅ͸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ, lenÀº º¸³¾ µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ® ¼ö À̸ç flags ´Â ±×³É 0À¸·Î ÇØ¾ß ÇÑ´Ù. (Ç÷¡±×¿¡ °üÇÑ º¸´Ù ÀÚ¼¼ÇÑ ³»¿ëÀº send()ÀÇ ¸Ç ÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ°Í.)

¾à°£ÀÇ ¿¹Á¦°¡ ´ÙÀ½°ú °°´Ù.
    char *msg = "Beej was here!";
    int len, bytes_sent;
    .
    .
    len = strlen(msg);
    bytes_sent = send(sockfd, msg, len, 0);
    .
    .
    .

send()´Â °á°ú°ªÀ¸·Î º¸³»Áø ¸ðµç ¹ÙÀÌÆ® ¼ö¸¦ µ¹·ÁÁִµ¥ ÀÌ°ÍÀº º¸³»¶ó°í ÇÑ ¼ýÀÚº¸´Ù ÀÛÀ» ¼öµµ ÀÖ´Ù. °¡²ûÀº º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍÀÇ Å©±â°¡ ¹Ìó °¨´çÇÏÁö ¸øÇÒ ¸¸ÇÑ ¼ýÀÚÀÎ °æ¿ìµµ ÀÖÀ¸¸ç ÀÌ °æ¿ì send()´Â ÀڱⰡ °¨´çÇÒ ¼ö ÀÖ´Â ¼ýÀÚ¸¸Å­¸¸ º¸³»°í ³ª¸ÓÁö´Â À߶ó ¹ö¸°ÈÄ ´ç½ÅÀÌ ±× ³ª¸ÓÁö¸¦ ´Ù½Ã º¸³» ÁÙ °ÍÀ¸·Î ±â´ëÇÏ´Â °ÍÀÌ´Ù. ¸¸¾à¿¡ º¸³»¶ó°í ÇÑ µ¥ÀÌÅÍÀÇ Å©±âº¸´Ù ÀÛÀº ¼ýÀÚ°¡ °á°ú°ªÀ¸·Î µ¹¾Æ ¿Ô´Ù¸é ±× ³ª¸ÓÁö µ¥ÀÌÅ͸¦ º¸³»´Â °ÍÀº ÀüÀûÀ¸·Î ´ç½ÅÀÇ Ã¥ÀÓÀÎ °ÍÀÌ´Ù. ±×³ª¸¶ Èñ¼Ò½ÄÀº µ¥ÀÌÅÍÀÇ »çÀÌÁî°¡ ÀÛ´Ù¸é (1k À̳»¶ó¸é) ¾Æ¸¶µµ Çѹø¿¡ ¸ðµÎ º¸³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¶ÇÇÑ ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ¸ç errno¸¦ ¼¼ÆÃÇÑ´Ù.

recv()ÀÇ °æ¿ìµµ »ó´çÈ÷ À¯»çÇÏ´Ù.
    int recv(int sockfd, void *buf, int len, unsigned int flags);

sockfd´Â Àоî¿Ã ¼ÒÄÏÀÇ ±â¼úÀÚÀ̸ç buf´Â Á¤º¸¸¦ ´ãÀ» ¹öÆÛÀÌ´Ù. lenÀº ¹öÆÛÀÇ ÃÖ´ë Å©±âÀÌ°í flags´Â 0À¸·Î ¼¼ÆÃÇØ¾ß ÇÑ´Ù. (ÀÚ¼¼ÇÑ flagsÀÇ Á¤º¸´Â recv() ¸Ç ÆäÀÌÁö¸¦ ÂüÁ¶ÇÒ°Í.)

recv()´Â ½ÇÁ¦ ÀоîµéÀÎ ¹ÙÀÌÆ® ¼ýÀÚ¸¦ µ¹·ÁÁÖ¸ç ¿¡·¯ÀÇ °æ¿ì´Â -1, errno¸¦ ¼¼ÆÃÇÑ´Ù.

½¬¿üÀ»±î? ½¬¿üÁö.. ÀÌÁ¦ ´ç½ÅÀº ½ºÆ®¸² ¼ÒÄÏÀ» ÀÌ¿ëÇؼ­ µ¥ÀÌÅ͸¦ º¸³»°í ¹ÞÀ» ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¿ì¿Í~ À¯´Ð½º ³×Æ®¿öÅ© ÇÁ·Î±×·¡¸Ó³×~~




4.7. sendto(), recvfrom() ; ¸» Á» ÇغÁ~ µ¥ÀÌÅͱ׷¥ ¹æ½Ä

±¦ÂúÀº°É, À̶ó°í ¸»ÇÏ°í ÀÖ´ÂÁÙ·Î »ý°¢ÇÏ°Ú´Ù. ±×·±µ¥ µ¥ÀÌÅͱ׷¥¿¡ °üÇÑ ³ª¸ÓÁö´Â ¾îµøÁö? ³ëÇÁ¶óºí·¹¸ð~ ¾Æ¹Ì°í~(¿ªÀÚ: Å͹̳×ÀÌÅÍ2°¡ »ý°¢³ª´Â±º~~) ÀÌÁ¦ ÇÒ °ÍÀÌ´Ù.

µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀº ¿¬°áÀ» ÇÒ ÇÊ¿ä°¡ ¾ø´Ù¸é µ¥ÀÌÅ͸¦ º¸³»±â Àü¿¡ ÁÖ¾î¾ß ÇÒ ³ª¸ÓÁö Á¤º¸´Â ¾î¶»°Ô ÁÖ¾î¾ß Çϴ°¡? ¸Â´Ù. ¸ñÀûÁöÀÇ ÁÖ¼Ò¸¦ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ¿©±â¿¡ ¿¹Á¦°¡ ÀÖ´Ù.
    int sendto(int sockfd, const void *msg, int len, unsigned int flags,
               const struct sockaddr *to, int tolen);

º¸´Ù½ÃÇÇ ÀÌ ÇÔ¼ö´Â µÎ°¡Áö ºÎ°¡Á¤º¸°¡ ´õ µé¾î°£ °Í ÀÌ¿Ü¿¡´Â ±âº»ÀûÀ¸·Î send()¿Í µ¿ÀÏÇÏ´Ù. to ´Â struct sockaddrÀÇ Æ÷ÀÎÅÍÀ̸ç(¾Æ¸¶µµ struct sockaddr_in) ¿©±â¿¡´Â ¸ñÀûÁöÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£°¡ ´ã°Ü ÀÖ¾î¾ß ÇÒ °ÍÀÌ´Ù. tolenÀº ±× ±¸Á¶Ã¼ÀÇ Å©±âÀÎ °ÍÀÌ´Ù.

send()¿Í ¸¶Âù°¡Áö·Î sendto()µµ º¸³»¾îÁø µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ®¼ö¸¦ °á°ú·Î µ¹·ÁÁÖ¸ç(½ÇÁ¦ º¸³»¶ó°í ÁØ µ¥ÀÌÅÍÀÇ Å©±âº¸´Ù ÀÛÀ»Áöµµ ¸ð¸£´Â), ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁØ´Ù.

ºñ½ÁÇÏ°Ô recvfrom()µµ ¾Æ·¡¿Í °°´Ù.
    int recvfrom(int sockfd, void *buf, int len, unsigned int flags
                 struct sockaddr *from, int *fromlen);

¿ª½Ã À̰͵µ µÎ°¡Áö º¯¼ö°¡ ´õ ÁÖ¾îÁö°Ô µÈ´Ù. fromÀº µ¥ÀÌÅ͸¦ º¸³»´Â ÀåºñÀÇ ÁÖ¼Ò¿Í Æ÷Æ®¸¦ ´ã°í ÀÖ´Â struct sockaddr À̸ç fromlenÀº ·ÎÄà Á¤¼öº¯¼ö·Î¼­ ±¸Á¶Ã¼ÀÇ Å©±â°¡ ¼¼ÆõǾî ÀÖ¾î¾ß ÇÑ´Ù. ÇÔ¼ö°¡ È£ÃâµÈ µÚ¿¡´Â fromlen¿¡´Â ½ÇÁ¦ fromÀÇ Å©±â°¡ ¼ö·ÏµÇ°Ô µÈ´Ù.

recvfrom()Àº ½ÇÁ¦ ¹ÞÀº µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ®¼ö¸¦ µ¹·ÁÁÖ¸ç ¿¡·¯ÀÇ °æ¿ì´Â -1, errno¸¦ ¼¼ÆÃÇÏ°Ô µÈ´Ù.

¸¸¾à connect()¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀ» ¿¬°áÇÑ ÈÄÀÇ »óȲÀ̶ó¸é °£´ÜÈ÷ send(), recv() ¸¦ »ç¿ëÇصµ »ó°ü ¾øÀ¸¸ç ¼ÒÄÏ ÀÎÅÍÆäÀ̽º´Â ÀÚµ¿À¸·Î ¸ñÀûÁö¿Í ¼Ò½º¿¡ °üÇÑ Á¤º¸¸¦ ÇÔ¼ö¿¡ Ãß°¡Çؼ­ ÀÛµ¿µÇ°Ô µÉ °ÍÀÌ´Ù.




4.8. close(), shutdown() ; ²¨Áö¼î.

ÈÞ~~ ÇÏ·çÁ¾ÀÏ µ¥ÀÌÅ͸¦ º¸³»°í ¹Þ¾Ò´õ´Ï..ÀÌÁ¦´Â ¼ÒÄÏÀ» ´ÝÀ» ¶§°¡ µÈ °ÍÀÌ´Ù. ÀÌ°Ç ½±´Ù. Á¤±Ô ÆÄÀÏ ±â¼úÀÚ¿¡ °üÇÑ close()¸¦ »ç¿ëÇÏ¸é µÇ´Â °ÍÀÌ´Ù.
    close(sockfd);

ÀÌ°ÍÀ¸·Î ´õÀÌ»óÀÇ ÀÔÃâ·ÂÀº ºÒ°¡´É ÇØÁö¸ç ´©±¸µçÁö ¿ø°ÝÁö¿¡¼­ ÀÌ ¼ÒÄÏ¿¡ ÀÐ°í ¾²·Á°í ÇÏ´Â ÀÚ´Â ¿¡·¯¸¦ ¹Þ°Ô µÉ °ÍÀÌ´Ù.

¾à°£ ´õ ¼¼¹ÐÇÑ Á¦¾î¸¦ À§Çؼ­´Â shutdown()À» »ç¿ëÇÏ¸é µÈ´Ù. ÀÌ°ÍÀ» ÀÌ¿ëÇϸé ƯÁ¤¹æÇâÀ¸·ÎÀÇ Åë½Å¸¸À» ²÷À» ¼öµµ ÀÖ°Ô µÈ´Ù.
    int shutdown(int sockfd, int how);

sockfd´Â ¼ÒÄÏ ±â¼úÀÚÀ̸ç how´Â ´ÙÀ½°ú °°´Ù.

0 - ´õÀÌ»óÀÇ ¼ö½Å ±ÝÁö 1 - ´õÀÌ»óÀÇ ¼Û½Å ±ÝÁö 2 - ´õÀÌ»óÀÇ ¼Û¼ö½Å ±ÝÁö(close()¿Í °°Àº °æ¿ì)

shutdown() Àº ¿¡·¯ÀÇ °æ¿ì -1À» µ¹·ÁÁÖ¸ç errno¸¦ ¼¼ÆÃÇÑ´Ù.

Ȳ¼ÛÇÏ¿É°Ôµµ ¿¬°áµµ µÇÁö¾ÊÀº µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ¿¡ shutdown()À» »ç¿ëÇÑ´Ù¸é ´ÜÁö send(), recv()¸¦ »ç¿ëÇÏÁö ¸øÇÏ°Ô¸¸ ¸¸µé °ÍÀÌ´Ù. connect()¸¦ »ç¿ëÇÑ °æ¿ì¿¡¸¸ ÀÌ·¸°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇØ¾ß ÇÑ´Ù. (¿ªÀÚ: ±×·¸´Ù¸é sendto, recvfromÀº »ç¿ëÀÌ µÈ´Ù´Â ¾ê±âÀΰ¡??Å×½ºÆ®°¡ ÇÊ¿äÇÒµí.)

¾Ï°Íµµ ¾Æ´Ï±º.




4.9. getpeername() ; ´©±¸½Ê´Ï±î?

ÀÌ ÇÔ¼ö´Â µÇ°Ô ½±´Ù.

³Ê¹« ½¬¿ö¼­ ÀýÀ» µû·Î ¸¸µé ÇÊ¿ä°¡ ¾øÁö¾Ê³ª °í¹ÎÇßÁö¸¸ ¿©±â ÀÖ´Â °É º¸´Ï±î..

getpeername()Àº »ó´ëÆí ÂÊ ½ºÆ®¸² ¼ÒÄÏ¿¡ ´©°¡ ¿¬°áµÇ¾î Àִ°¡¸¦ ¾Ë·ÁÁØ´Ù.
    #include <sys/socket.h>

    int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);

sockfd´Â ¿¬°áµÈ ½ºÆ®¸² ¼ÒÄÏÀÇ ±â¼úÀÚÀ̸ç addrÀº »ó´ëÆíÀÇ Á¤º¸¸¦ ´ã°Ô µÉ struct sockaddr(¶Ç´Â struct sockaddr_in)ÀÇ Æ÷ÀÎÅÍ À̸ç addrlenÀº Á¤¼ö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅͷμ­ ±¸Á¶Ã¼ÀÇ Å©±â°¡ ÁöÁ¤µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

¿¡·¯ÀÇ °æ¿ì´Â -1À» µ¹·ÁÁÖ°í errno¸¦ ¼¼ÆÃÇÑ´Ù. (¿Ü¿ì°Ú±º.)

ÀÏ´Ü ÁÖ¼Ò¸¦ ¾Ë°ÔµÇ¸é inet_ntoa()³ª gethostbyaddr()À» ÀÌ¿ëÇÏ¿© Á»´õ ¸¹Àº Á¤º¸¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ°Ô µÇÁö¸¸ »ó´ëÆíÀÇ login nameÀ» ¾Ë°ÔµÇ´Â °ÍÀº ¾Æ´Ï´Ù. (¸¸ÀÏ »ó´ëÆí¿¡ ident µ¥¸óÀÌ µ¹°í ÀÖ´Ù¸é ¾Ë¾Æ³¾ ¹æ¹ýÀÌ ¾ø´Â °ÍÀº ¾Æ´ÏÁö¸¸ ÀÌ ³»¿ëÀº ÀÌ ±ÛÀÇ ÃëÁö¸¦ ¹þ¾î³ª´Â ³»¿ëÀ̹ǷΠRFC-1413À» ÂüÁ¶Ç϶ó°í ¸»ÇÏ°í ½Í´Ù.)




4.10. gethostname() ; ³­ ´©±¸Àΰ¡?

getpeername()º¸´Ù ´õ ½¬¿î °ÍÀÌ ÀÌ ÇÔ¼öÀÌ´Ù. °á°ú·Î ÇÁ·Î±×·¥ÀÌ µ¹°í ÀÖ´Â ÄÄÇ»ÅÍÀÇ À̸§À» ¾Ë·ÁÁØ´Ù. À̸§Àº gethostbyname()À» ÀÌ¿ëÇÏ¿© ·ÎÄà ÀåºñÀÇ IPÁÖ¼Ò¸¦ ¾Ë¾Æ³»´Âµ¥ »ç¿ëµÉ ¼öµµ ÀÖ´Ù.

¹¹°¡ ´õ Àç¹ÌÀִ°¡? ¸î°¡Áö »ý°¢ÇØ º¼ ¼ö Àִµ¥ ÀÌ ¹®¼­¿¡´Â ÀûÀýÇÏÁö ¾ÊÀº ³»¿ëÀÌ´Ù(¿ªÀÚ: °ú¿¬ ¹»±î..µÇ°Ô ±Ã±ÝÇϳ×..). ¾î·°Å³ª,
    #include <unistd.h>

    int gethostname(char *hostname, size_t size);

hostnameÀº ¹®ÀÚ¿­ÀÇ Æ÷ÀÎÅÍÀ̸ç ÇÔ¼ö°¡ µ¹·ÁÁÖ´Â °ªÀ» ´ã°Ô µÉ º¯¼öÀÌ´Ù. size´Â ±× ¹®ÀÚ¿­ÀÇ Å©±âÀÌ´Ù.

¼º°øÀûÀ̸é 0À», ¿¡·¯ÀÇ °æ¿ì -1À» ¸®ÅÏÇÏ°í errno¸¦ ¼¼ÆÃÇÑ´Ù.




4.11. DNS ; whitehouse.gov - 198.137.240.100

¸ð¸£´Â »ç¶÷À» À§ÇÏ¿© DNS´Â Domain Name Service ¶ó´Â °ÍÀ» ¸ÕÀú ¾ê±â ÇÏ°Ú´Ù. °£°áÇÏ°Ô ¾ê±âÇÑ´Ù¸é DNS¿¡´Ù°¡ »ç¶÷ÀÌ ÀÐÀ» ¼ö ÀÖ´Â ÁÖ¼Ò¸¦ ¸»ÇØÁÖ¸é DNS´Â bind,connect,sendto,¾î·°Å³ª IPÁÖ¼Ò°¡ ÇÊ¿äÇÑ °Íµé¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â IPÁÖ¼Ò¸¦ µ¹·ÁÁØ´Ù. Áï ´©±º°¡°¡ ÀÌ·¸°Ô ÀÔ·ÂÇß´Ù¸é
    $ telnet whitehouse.gov

telnet Àº connect()¿¡ »ç¿ëÇϱâ À§Çؼ­ 198.137.240.100À̶ó´Â IPÁÖ¼Ò¸¦ ã¾Æ³»°Ô µÈ´Ù. ±×·±µ¥ ¾î¶»°Ô ±×·¸°Ô ÇÏ´Â °ÍÀΰ¡? gethostbyname()À» »ç¿ëÇÏ¸é µÈ´Ù.
    #include <netdb.h> 
    
    struct hostent *gethostbyname(const char *name);

º¸´Ù½ÃÇÇ °á°ú·Î struct hostentÀÇ Æ÷ÀÎÅÍ°¡ µ¹¾Æ¿Â´Ù. ±× ±¸Á¶´Â ¾Æ·¡¿Í °°´Ù.
    struct hostent {
        char    *h_name;
        char    **h_aliases;
        int     h_addrtype;
        int     h_length;
        char    **h_addr_list;
    };
    #define h_addr h_addr_list[0]

°¢ Çʵ忡 ´ëÇÑ ¼³¸íÀº ´ÙÀ½°ú °°´Ù.

  • h_name - È£½ºÆ®ÀÇ °ø½ÄÀûÀÎ À̸§
  • h_aliases - È£½ºÆ®ÀÇ º°¸íÀ¸·Î¼­ NULL ·Î ³¡¸ÎÀ½µÈ´Ù.
  • h_addrtype - ÁÖ¼ÒÀÇ Á¾·ù, º¸Åë AF_INET
  • h_length - ÁÖ¼ÒÀÇ ¹ÙÀÌÆ® ¼ö
  • h_addr_list - 0À¸·Î ³¡³ª´Â ³×Æ®¿öÅ© ÁÖ¼Òµé, NBO·Î µÇ¾î ÀÖ´Ù.
  • h_addr - h_addr_list¼ÓÀÇ Ã¹¹ø° ÁÖ¼Ò

gethostbyname()Àº À§ÀÇ ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ°Ô µÇ¸ç ¿¡·¯ÀÇ °æ¿ì NULLÀ» µ¹·ÁÁØ´Ù. errno´Â ¼¼ÆõÇÁö ¾Ê°í h_errno°¡ ¼¼ÆÃÀÌ µÈ´Ù. (¾Æ·¡ÀÇ herror()ÂüÁ¶)

±×·±µ¥ ÀÌ°É ¾î¶»°Ô »ç¿ëÇϴ°¡? º¸Åë ÄÄÇ»ÅÍ ¸Å´º¾óµé ó·³ µ¶ÀÚ ¾Õ¿¡ Á¤º¸¸¦ ¸¶±¸ ½×¾Æ³õÀº °Í¸¸À¸·Î´Â ºÎÁ·ÇÑ ¹ýÀÌ´Ù. ÀÌ ÇÔ¼ö´Â »ç½Ç º¸±âº¸´Ù´Â ¾²±â°¡ ½¬¿î ÆíÀÌ´Ù.

¿¹Á¦¸¦ º¸ÀÚ.
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <netdb.h> 
    #include <sys/types.h>
    #include <netinet/in.h> 

    int main(int argc, char *argv[])
    {
        struct hostent *h;

        if (argc != 2) {  /* error check the command line */
            fprintf(stderr,"usage: getip address\n");
            exit(1);
        }

        if ((h=gethostbyname(argv[1])) == NULL) {  /* get the host info */
            herror("gethostbyname");
            exit(1);
        }

        printf("Host name  : %s\n", h->h_name);
        printf("IP Address : %s\n",inet_ntoa(*((struct in_addr *)h->h_addr)));

        return 0;
    }

gethostbyname()¿¡¼­´Â errno°¡ ¼¼ÆõÇÁö ¾Ê´Â ±î´ßÀ¸·Î perror()¸¦ »ç¿ëÇÒ ¼ö ¾ø°í herror()À» »ç¿ëÇØ¾ß ÇÑ´Ù.

°£´ÜÈ÷ È£½ºÆ®ÀÇ À̸§À» ´ã°í ÀÖ´Â ½ºÆ®¸µÀ» gethostbyname() ÇÔ¼ö¿¡ ³Ö¾î ÁÜÀ¸·Î½á ¹Ù·Î struct hostent ¸¦ ¾ò°Ô µÇ´Â °ÍÀÌ´Ù.

³²¾ÆÀÖ´Â ÇÑ°¡Áö ¼ö»óÇÑ Á¡Àº À§ÀÇ ¹æ¹ýÀ¸·Î ¾î¶»°Ô ÁÖ¼Ò¸¦ ¼ýÀÚ¿Í Á¡À¸·Î Ãâ·ÂÇÒ °ÍÀΰ¡ ÇÏ´Â ¹®Á¦ÀÌ´Ù. h->h_addr Àº ¹®ÀÚ Æ÷ÀÎÅÍ( char *) Àε¥ inet_ntoa()´Â º¯¼ö·Î¼­ struct in_addr À» ¿øÇϱ⠶§¹®ÀÌ´Ù. µû¶ó¼­ h->h_addr À» struct in_addr * À¸·Î Çüº¯È¯À» ÇÏ°í °á°ú°ªÀ» ¾ò±â À§ÇØ ´Ù½Ã ¿ªÂüÁ¶ ÇÏ¸é µÈ´Ù´Â °ÍÀÌ´Ù.




5. Ŭ¶óÀ̾ðÆ®-¼­¹öÀÇ ¹è°æ

¿äÁòÀº Ŭ¶óÀ̾ðÆ®-¼­¹ö°¡ ÆÇÄ¡´Â ¼¼»óÀÌÁÒ~~ ³×Æ®¿öÅ©¿¡ °üÇÑ ¸ðµç °ÍÀº ¼­¹ö ÇÁ·Î¼¼½º¸¦ ¿äûÇϴ Ŭ¶óÀ̾ðÆ® ÇÁ·Î¼¼½º·Î¼­ ´Ù·ç¾îÁø´Ù. ÅÚ³ÝÀ» ÀÌ¿ëÇÏ¿© 23¹ø Æ÷Æ®¿¡ Á¢¼ÓÇÏ´Â (Ŭ¶óÀ̾ðÆ®)°ÍÀº ¼­¹öÇÁ·Î±×·¥(telnetd)À» ÀÛµ¿½ÃÅ°°Ô µÇ´Â °ÍÀ̸ç ÀÌ ¼­¹ö ÇÁ·Î±×·¥Àº µé¾î¿À´Â °¢Á¾ ½ÅÈ£¸¦ ¹Þ¾Æµé¿©¼­ ´ç½ÅÀÇ ÅÚ³Ý Á¢¼ÓÀ» À§ÇÏ¿© ·Î±×ÀÎ ÇÁ·ÒÇÁÆ®¸¦ ÁÖ°Ô µÇ´Â °ÍÀÌ´Ù. µîµî..
±×¸²2. Ŭ¶óÀ̾ðÆ®-¼­¹ö°£ÀÇ °ü°è

Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£ÀÇ Á¤º¸ ±³È¯ÀÇ ¸ðµ¨ÀÌ ±×¸²¿¡ Àß ³ª¿ÍÀÖ´Ù.

ÁÖ¸ñÇÒ Á¡Àº Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°£¿¡´Â SOCK_STREAMÀ̵ç, SOCK_DGRAMÀ̵çÁö°£¿¡ °°Àº °ÍÀ¸·Î¸¸ µÈ´Ù¸é ÀÇ»ç¼ÒÅëÀÌ µÈ´Ù´Â °ÍÀÌ´Ù. ÁÁÀº ¿¹µéÀº telnet-telnetd, ftp-ftpd, ¶Ç´Â bootp-bootpd µîÀÌ´Ù. ftp¸¦ ¾´´Ù¸é ¹Ýµå½Ã »ó´ëÆí¿¡ ftpd°¡ µ¹°í ÀÖ´Ù´Â °ÍÀÌ´Ù.

º¸Åë È£½ºÆ®¿¡´Â ÇϳªÀÇ ¼­¹ö ÇÁ·Î±×·¥ÀÌ µ¹°í ÀÖ°Ô µÈ´Ù. ±×¸®°í ±× ¼­¹ö´Â fork()¸¦ ÀÌ¿ëÇÏ¿© ´ÙÁßÀÇ Å¬¶óÀ̾ðÆ®¸¦ ¹Þ°Ô µÇ´Â °ÍÀÌ´Ù. ±âº»ÀûÀÎ ·çƾÀÇ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù. ¼­¹ö´Â Á¢¼ÓÀ» ´ë±âÇÏ´Ù°¡ accept()¸¦ È£ÃâÇÏ°Ô µÇ¸ç ±× ¶§ fork()¸¦ ÀÌ¿ëÇÏ¿© ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¸¸µé¾î³»¾î ±× Á¢¼ÓÀ» ó¸®ÇÏ°Ô µÈ´Ù. ÀÌ°ÍÀÌ ¹Ù·Î ´ÙÀ½¿¡ ¼Ò°³µÉ ¿¹Á¦ ¼­¹ö ÇÁ·Î±×·¥ÀÇ ±¸Á¶ÀÌ´Ù.




5.1. °£´ÜÇÑ ½ºÆ®¸² ¼­¹ö

ÀÌ ¼­¹ö°¡ ÇÏ´Â ÀÏÀº ¿ÀÁ÷ ½ºÆ®¸² Á¢¼ÓÀ» ÇÏ°Ô µÇ´Â ¸ðµç Ŭ¶óÀ̾ðÆ®¿¡°Ô "Hello, World!\n"À» Ãâ·ÂÇØ ÁÖ´Â °ÍÀÌ´Ù. ÀÌ ¼­¹ö¸¦ Å×½ºÆ®Çϱâ À§Çؼ­´Â ÇϳªÀÇ À©µµ¿ì¿¡¼­ ÀÌ ¼­¹ö¸¦ ½ÇÇà½ÃÄÑ ³õ°í ´Ù¸¥ À©µµ¿ì¿¡¼­ ÅÚ³Ý Á¢¼ÓÀ» ½ÃµµÇØ º¸´Â °ÍÀÌ´Ù.
    $ telnet remotehostname 3490

hostname Àº ¼­¹ö ÇÁ·Î±×·¥ÀÌ ÀÛµ¿µÈ È£½ºÆ®ÀÇ À̸§ÀÌ´Ù.

¼­¹ö ÇÁ·Î±×·¥ ÄÚµå
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h> 
    #include <sys/wait.h> 

    #define MYPORT 3490    /* the port users will be connecting to */

    #define BACKLOG 10     /* how many pending connections queue will hold */

    main()
    {
        int sockfd, new_fd;  /* listen on sock_fd, new connection on new_fd */
        struct sockaddr_in my_addr;    /* my address information */
        struct sockaddr_in their_addr; /* connector's address information */
        int sin_size;

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }

        my_addr.sin_family = AF_INET;         /* host byte order */
        my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
        my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
        bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */

        if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
                                                                      == -1) {
            perror("bind");
            exit(1);
        }

        if (listen(sockfd, BACKLOG) == -1) {
            perror("listen");
            exit(1);
        }

        while(1) {  /* main accept() loop */
            sin_size = sizeof(struct sockaddr_in);
            if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
                                                          &sin_size)) == -1) {
                perror("accept");
                continue;
            }
            printf("server: got connection from %s\n", \
                                               inet_ntoa(their_addr.sin_addr));
            if (!fork()) { /* this is the child process */
                if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
                    perror("send");
                close(new_fd);
                exit(0);
            }
            close(new_fd);  /* parent doesn't need this */

            while(waitpid(-1,NULL,WNOHANG) > 0); /* clean up child processes */
        }
    }

ÀÌ ÄÚµå´Â ¹®¹ý»óÀÇ ´Ü¼øÇÔÀ» À§ÇÏ¿© ÇϳªÀÇ Ä¿´Ù¶õ(³» »ý°¢¿¡) main()¿¡ ¸ðµç °ÍÀÌ µé¾î°¡ ÀÖ´Ù. ¸¸¾à¿¡ ÀÌ°ÍÀ» Àß°Ô Àß¶ó¼­ ÀÛÀº ¿©·¯°³ÀÇ ÇÔ¼ö·Î ±¸¼ºÀ» Çϴ°ÍÀÌ ÁÁ´Ù°í »ý°¢µÈ´Ù¸é ±×·¡µµ µÈ´Ù.

´ÙÀ½ÀÇ Å¬¶óÀ̾ðÆ® Äڵ带 ÀÌ¿ëÇÑ´Ù¸é ÀÌ ¼­¹ö·ÎºÎÅÍ ¹®ÀÚ¿­À» ¹Þ¾Æ ³¾¼öµµ ÀÖ´Ù.




5.2. °£´ÜÇÑ ½ºÆ®¸² Ŭ¶óÀ̾ðÆ®

À̳༮Àº ¼­¹öº¸´Ù ´õ ½¬¿î ÄÚµåÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥ÀÌ ÇÏ´Â ÀÏÀº ¸í·ÉÇà¿¡¼­ ÁöÁ¤µÈ ÁÖ¼Ò¿¡ 3490¹ø Æ÷Æ®¿¡ Á¢¼ÓÇÏ¿© ¼­¹ö°¡ º¸³»´Â ¹®ÀÚ¿­À» ¹Þ´Â °Í »ÓÀÌ´Ù.

    /*
    ** client.c -- a stream socket client demo
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>

    #define PORT 3490 // the port client will be connecting to

    #define MAXDATASIZE 100 // max number of bytes we can get at once

    int main(int argc, char *argv[])
    {
        int sockfd, numbytes;  
        char buf[MAXDATASIZE];
        struct hostent *he;
        struct sockaddr_in their_addr; // connector's address information

        if (argc != 2) {
            fprintf(stderr,"usage: client hostname\n");
            exit(1);
        }

        if ((he=gethostbyname(argv[1])) == NULL) {  // get the host info
            perror("gethostbyname");
            exit(1);
        }

        if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }

        their_addr.sin_family = AF_INET;    // host byte order
        their_addr.sin_port = htons(PORT);  // short, network byte order
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        memset(&(their_addr.sin_zero), '\0', 8);  // zero the rest of the struct

        if (connect(sockfd, (struct sockaddr *)&their_addr,
                                              sizeof(struct sockaddr)) == -1) {
            perror("connect");
            exit(1);
        }

        if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
            perror("recv");
            exit(1);
        }

        buf[numbytes] = '\0';

        printf("Received: %s",buf);

        close(sockfd);

        return 0;
    }


ÀÌ Å¬¶óÀ̾ðÆ®¸¦ ÀÛµ¿Çϱ⿡ ¾Õ¼­¼­ ¼­¹ö¸¦ ÀÛµ¿½ÃÄѳõÁö ¾Ê¾Ò´Ù¸é connect()ÇÔ¼ö´Â "Connection refused"¸¦ µ¹·ÁÁÖ°Ô µÉ°ÍÀÌ´Ù. ¾µ¸¸Çϱº!




5.3. µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ

ÀÌ¿¡ °üÇؼ­´Â ±×´ÙÁö ¾ê±âÇÒ °ÍÀÌ ¸¹Áö ¾Ê´Ù. µû¶ó¼­ ±×³É µÎ°³ÀÇ ÇÁ·Î±×·¥À» º¸¿© ÁÖ°Ú´Ù.

listener´Â È£½ºÆ®¿¡ ¾É¾Æ¼­ 4950Æ÷Æ®¿¡ µé¾î¿À´Â µ¥ÀÌÅÍ ÆÐŶÀ» ±â´Ù¸°´Ù. talker´Â ÁöÁ¤µÈ È£½ºÆ®ÀÇ ±× Æ÷Æ®·Î ¹¹µçÁö °£¿¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ µ¥ÀÌÅ͸¦ º¸³½´Ù.

listener.c
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <sys/socket.h> 
    #include <sys/wait.h> 

    #define MYPORT 4950    /* the port users will be connecting to */

    #define MAXBUFLEN 100

    main()
    {
        int sockfd;
        struct sockaddr_in my_addr;    /* my address information */
        struct sockaddr_in their_addr; /* connector's address information */
        int addr_len, numbytes;
        char buf[MAXBUFLEN];

        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }

        my_addr.sin_family = AF_INET;         /* host byte order */
        my_addr.sin_port = htons(MYPORT);     /* short, network byte order */
        my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
        bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */

        if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
                                                                       == -1) {
            perror("bind");
            exit(1);
        }

        addr_len = sizeof(struct sockaddr);
        if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \
                           (struct sockaddr *)&their_addr, &addr_len)) == -1) {
            perror("recvfrom");
            exit(1);
        }

        printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
        printf("packet is %d bytes long\n",numbytes);
        buf[numbytes] = '\0';
        printf("packet contains \"%s\"\n",buf);

        close(sockfd);
    }

°á±¹ socket()¸¦ È£ÃâÇÒ ¶§ SOCK_DGRAMÀ» »ç¿ëÇÏ°Ô µÈ °ÍÀ» ÁÖÀÇÇÏ°í, listen()À̳ª accept()¸¦ »ç¿ëÇÏÁö ¾ÊÀº°Íµµ ÁÖÀÇÇØ ºÁ¾ß ÇÑ´Ù. ÀÌ Äڵ尡 ¹Ù·Î ºñ¿¬°á µ¥ÀÌÅͱ׷¥ ¼ÒÄÏÀÇ ÀÚ¶û½º·¯¿î »ç¿ë¿¹ÀÎ °ÍÀÌ´Ù.

talker.c
    #include <stdio.h> 
    #include <stdlib.h> 
    #include <errno.h> 
    #include <string.h> 
    #include <sys/types.h> 
    #include <netinet/in.h> 
    #include <netdb.h> 
    #include <sys/socket.h> 
    #include <sys/wait.h> 

    #define MYPORT 4950    /* the port users will be connecting to */

    int main(int argc, char *argv[])
    {
        int sockfd;
        struct sockaddr_in their_addr; /* connector's address information */
        struct hostent *he;
        int numbytes;

        if (argc != 3) {
            fprintf(stderr,"usage: talker hostname message\n");
            exit(1);
        }

        if ((he=gethostbyname(argv[1])) == NULL) {  /* get the host info */
            herror("gethostbyname");
            exit(1);
        }

        if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
            perror("socket");
            exit(1);
        }

        their_addr.sin_family = AF_INET;      /* host byte order */
        their_addr.sin_port = htons(MYPORT);  /* short, network byte order */
        their_addr.sin_addr = *((struct in_addr *)he->h_addr);
        bzero(&(their_addr.sin_zero), 8);     /* zero the rest of the struct */

        if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \
             (struct sockaddr *)&their_addr, sizeof(struct sockaddr))) == -1) {
            perror("sendto");
            exit(1);
        }

        printf("sent %d bytes to %s\n",numbytes,inet_ntoa(their_addr.sin_addr));

        close(sockfd);

        return 0;
    }

ÀÌ°ÍÀÌ ÀüºÎ´Ù. listener¸¦ ÇÑ È£½ºÆ®¿¡¼­ ½ÇÇà ½ÃÅ°°í ´Ù¸¥ °÷¿¡¼­ talker¸¦ ½ÇÇà½ÃŲ´Ù. ÇÙ°¡Á·½Ã´ë¿¡ ¾î¿ï¸®´Â °¡Á·¿ë ¿À¶ôÀÌ µÉ ¼öµµ...

¾Õ¿¡¼­µµ ¾ê±âÇß¾úÁö¸¸ ÇÑ°¡Áö ÀÛÀº ³»¿ëÀ» ´õ ¸»ÇØ¾ß ÇÒ°Í °°´Ù. ¸¸¾à talker¿¡¼­ connect()¸¦ È£ÃâÇؼ­ ¿¬°áÀ» Çß´Ù¸é ±× ´ÙÀ½ºÎÅÍ´Â sendto(), recvfrom()ÀÌ ¾Æ´Ï¶ó ±×³É send().recv()¸¦ »ç¿ëÇصµ µÈ´Ù´Â °ÍÀÌ´Ù. Àü´ÞµÇ¾î¾ß Çϴ ȣ½ºÆ®ÀÇ ÁÖ¼Ò´Â connect()¿¡ ÁöÁ¤µÈ ÁÖ¼Ò°¡ »ç¿ëµÇ°Ô µÈ´Ù.




6. ¾à°£ ¼öÁØ ³ôÀº ±â¹ýµé

6.1. ºí·ÎÅ·

ºí·ÎÅ·. ¾Æ¸¶ µé¾îºÃ°ÚÁö. ±×·±µ¥ µµ´ëü ±×°Ô ¹»±î? »ç½Ç "Àáµé´Ù"ÀÇ ±â¼ú¿ë¾î¿¡ ºÒ°úÇÑ °ÍÀÌ´Ù. ¾Æ¸¶µµ listener¸¦ ½ÇÇà½ÃÅ°¸é¼­ ´«Ä¡¸¦ ë°ÚÁö¸¸ ±× ÇÁ·Î±×·¥Àº ±×Àú ¾É¾Æ¼­ µ¥ÀÌÅÍ ÆÐŶÀÌ ¿Ã¶§±îÁö ±â´Ù¸®´Â °ÍÀÌ´Ù. ÀáÀڸ鼭.. recvfrom()À» È£ÃâÇߴµ¥ µ¥ÀÌÅÍ°¡ µé¾î¿Â °ÍÀÌ ¾ø´Ù¸é? ¹Ù·Î ¹º°¡ µ¥ÀÌÅÍ°¡ µé¾î¿Ã ¶§±îÁö ºí·ÎÅ·ÀÌ µÇ´Â °ÍÀÌ´Ù(±×³É °Å±â¼­ ÀÚ°í ÀÖ´Â °ÍÀÌ´Ù.).

¸¹Àº ÇÔ¼öµéÀÌ ºí·ÎÅ·ÀÌ µÈ´Ù. accept()´Â ºí·ÏÀÌ µÈ´Ù. recv*()Á¾·ùµéÀÌ ¸ðµÎ ºí·ÏÀÌ µÈ´Ù. ±×µéÀÌ ÀÌ·¸°Ô ÇÒ ¼ö ÀÖ´Â ÀÌÀ¯´Â ±×·¸°Ô ÇÒ ¼ö ÀÖµµ·Ï Çã¶ôÀ» ¹Þ¾Ò±â ¶§¹®ÀÌ´Ù. óÀ½¿¡ socket()À¸·Î ¼ÒÄÏÀÌ ¸¸µé¾îÁú¶§ Ä¿³ÎÀÌ ºí·Ï °¡´ÉÇϵµ·Ï ¼¼ÆÃÀ» Ç߱⠶§¹®ÀÌ´Ù. ¸¸ÀÏ ºí·ÏÇÒ ¼ö ¾øµµ·Ï ¼¼ÆÃÇÏ·Á¸é fcntl()À» »ç¿ëÇÑ´Ù.
    #include <unistd.h>
    #include <fcntl.h>
    .
    .
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    fcntl(sockfd, F_SETFL, O_NONBLOCK);
    .
    .

¼ÒÄÏÀ» ºí·ÏÇÒ ¼ö ¾øµµ·Ï ¼¼ÆÃÇÔÀ¸·Î½á Á¤º¸¸¦ ÃßÃâÇÏ´Â µ¥¿¡ È¿°úÀûÀ¸·Î socketÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ µ¥ÀÌÅÍ°¡ Á¢¼öµÇÁö ¾ÊÀº ¼ÒÄÏ¿¡¼­ µ¥ÀÌÅ͸¦ ÀÐÀ¸·Á°í ½ÃµµÇÑ´Ù¸é -1À» °á°ú·Î µ¹·ÁÁÖ°í errno¸¦ EWOULDBLOCK À¸·Î ¼¼ÆÃÇÏ°Ô µÈ´Ù.

ÀϹÝÀûÀ¸·Î´Â ÀÌ·± ½ÄÀ¸·Î Á¤º¸¸¦ »Ì¾Æ ³»´Â °ÍÀº º°·Î ÁÁÀº ¹æ½ÄÀº ¾Æ´Ï´Ù. ¸¸ÀÏ µé¾î¿À´Â µ¥ÀÌÅ͸¦ °¨½ÃÇϱâ À§ÇÏ¿© ÀÌ·± ¹æ½ÄÀ¸·Î ¹Ù»Ú°Ô µ¥ÀÌÅ͸¦ ã´Â ·çƾÀ» ¸¸µç´Ù¸é ÀÌ´Â CPU ½Ã°£À» ¼Ò¸ðÇÏ°Ô µÇ´Â °ÍÀÌ´Ù. ±¸½ÄÀÌ´Ù. º¸´Ù ¸ÚÁø ¹æ¹ýÀº ´ÙÀ½Àý¿¡ ³ª¿À´Â select()¸¦ »ç¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ±â´Ù¸®´Â ½ÄÀÌ´Ù.




6.2. select() ; µ¿±âÈ­µÈ Áߺ¹ ÀÔÃâ·Â. ´ë´ÜÇϱº!

ÀÌ°Ç ¹º°¡ Á» ÀÌ»óÇÑ ÇÔ¼öÀÌ´Ù. ±×·¯³ª »ó´çÈ÷ À¯¿ëÇϹǷΠÀß Àо±â ¹Ù¶õ´Ù. ´ÙÀ½ »óȲÀ» °¡Á¤ÇØ º¸ÀÚ. Áö±Ý ¼­¹ö¸¦ µ¹¸®°í ÀÖÀ¸¸ç ÀÌ¹Ì ¿¬°áµÈ ¼ÒÄÏ¿¡¼­ µ¥ÀÌÅÍ°¡ µé¾î¿À´Â °ÍÀ» ±â´Ù¸®°í ÀÖ´Ù°í ÇÏÀÚ.

¹®Á¦¾øÁö, ±×³É accept()ÇÏ°í recv()¸î°³¸é µÉÅÙµ¥.. ¼­µÑÁö ¸»Áö¾î´Ù, Ä£±¸. ¸¸ÀÏ accept()¿¡¼­ ºí·ÎÅ·ÀÌ µÈ´Ù¸é? µ¿½Ã¿¡ ¾î¶»°Ô recv()¸¦ ¾µ °ÍÀΰ¡? ºí·ÎÅ· ¸øÇÏ°Ô ¼¼ÆÃÇÑ´Ù°í? CPU½Ã°£À» ³¶ºñÇÏÁö ¸»¶ó´Ï±î. ±×·¯¸é ¾î¶»°Ô?

´õÀÌ»ó ¶°µéÁö ¸»°í ´ÙÀ½À» º¸¿©ÁÖ°Ú´Ù.
       #include <sys/time.h> 
       #include <sys/types.h> 
       #include <unistd.h> 

       int select(int numfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);

ÀÌ ÇÔ¼ö´Â È­ÀÏ ±â¼úÀÚÀÇ "ÁýÇÕ", Ưº°È÷ readfds,writefds,exceptfds µîÀ» °ü¸®ÇÑ´Ù. ¸¸ÀÏ ÀϹÝÀûÀÎ ÀÔ·ÂÀ̳ª ¼ÒÄÏ ±â¼úÀڷκÎÅÍ ÀÐ¾î µéÀϼö Àִ°¡¸¦ È®ÀÎÇÏ·Á¸é ´ÜÁö È­ÀÏ ±â¼úÀÚ 0°ú sockfd¸¦ readfds¿¡ ´õÇØÁֱ⸸ ÇÏ¸é µÈ´Ù. numfds´Â °¡Àå ³ôÀº ÆÄÀÏ ±â¼úÀÚ¿¡´Ù°¡ 1À» ´õÇؼ­ ÁöÁ¤ÇØ¾ß Çϸç À̹ø ¿¹Á¦¿¡¼­´Â Á¤±Ô ÀÔ·ÂÀÇ 0º¸´Ù È®½ÇÈ÷ Å©°Ô Çϱâ À§Çؼ­ sockfd+1 À» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

select()ÀÇ °á°ú°ªÀÌ ³ª¿Ã¶§ readfs´Â ¼±ÅÃÇÑ ÆÄÀÏ ±â¼úÀÚ Áß¿¡ ¾î¶² °ÍÀÌ Àб⠰¡´ÉÇÑ°¡¸¦ ¹Ý¿µÇÒ ¼ö ÀÖµµ·Ï ¼öÁ¤µÇ¸ç FD_ISSET() ¸ÅÅ©·Î¸¦ ÀÌ¿ëÇÏ¿© üũÇÒ ¼ö ÀÖ´Ù.

³Ê¹« ¸Ö¸® ³ª°¡±â Àü¿¡ ÀÌ "ÁýÇÕ"µéÀ» ¾î¶»°Ô °ü¸®ÇÏ´Â °¡¿¡ ´ëÇؼ­ ¾ê±â¸¦ ÇØ¾ß ÇÒ°Í °°´Ù. °¢°¢ÀÇ "ÁýÇÕ"Àº fd_setÇüÀÌ¸ç ´ÙÀ½ÀÇ ¸ÅÅ©·Îµé·Î À̸¦ Á¦¾îÇÒ ¼ö ÀÖ´Ù.

FD_ZERO(fd_set *set) - ÆÄÀϱâ¼úÀÚ ÁýÇÕÀ» ¼Ò°ÅÇÑ´Ù. FD_SET(int fd, fd_set *set) - fd ¸¦ set¿¡ ´õÇØÁØ´Ù. FD_CLR(int fd, fd_set *set) - fd ¸¦ set¿¡¼­ »©ÁØ´Ù. FD_ISSET(int fd, fd_set *set) - fd°¡ set¾È¿¡ ÀÖ´ÂÁö È®ÀÎÇÑ´Ù.

³¡À¸·Î ÀÌ ¼ö»óÇÑ struct timevalÀº ¶Ç ¹«¾ùÀΰ¡? ¾Æ¸¶µµ ´©±º°¡°¡ ¾î¶² µ¥ÀÌÅ͸¦ º¸³»´Â °ÍÀ» ¹«ÇÑÁ¤ ±â´Ù¸®±â¸¦ ¿øÄ¡´Â ¾ÊÀ» °ÍÀÌ´Ù. ƯÁ¤ ½Ã°£¸¶´Ù ¾Æ¹« Àϵµ ¾È ¹ú¾îÁö´õ¶óµµ "ÇöÀç ÁøÇà Áß..."À̶ó´Â ¸Þ½ÃÁö¸¦ Å͹̳ο¡ Ãâ·Â½ÃÅ°±â¶óµµ ¿øÇÒ °ÍÀÌ´Ù. ÀÌ ±¸Á¶Ã¼´Â ±× ½Ã°£ °£°ÝÀ» Á¤ÀÇÇϱâ À§Çؼ­ »ç¿ëµÇ´Â °ÍÀÌ´Ù. ÀÌ ½Ã°£ÀÌ ÃÊ°úµÇ°í ±× ¶§±îÁö select()°¡ ¾Æ¹«·± º¯È­¸¦ °¨ÁöÇÏÁö ¸øÇÑ °æ¿ì¶ó¸é °á°ú¸¦ µ¹·ÁÁÖ°í ´ÙÀ½ ÀÛ¾÷À» ÁøÇà ÇÒ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.

struct timevalÀÇ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

    struct timeval {
        int tv_sec;     /* seconds */
        int tv_usec;    /* microseconds */
    };

±â´Ù¸± ½Ã°£ÀÇ Ãʸ¦ ÁöÁ¤ÇÏ·Á¸é ±×³É tv_sec¿¡ ÁöÁ¤ÇÏ¸é µÈ´Ù. tv_usec¿¡´Â ¸¶ÀÌÅ©·Î Ãʸ¦ ÁöÁ¤ÇÑ´Ù. ¹Ð¸®ÃÊ°¡ ¾Æ´Ï°í ¸¶ÀÌÅ©·ÎÃÊÀÌ´Ù. ¸¶ÀÌÅ©·ÎÃÊ´Â ¹é¸¸ºÐÀÇ ÀÏÃÊÀÌ´Ù. ±×·±µ¥ ¿Ö usecÀΰ¡? u´Â ±×¸®½º ¹®ÀÚÀÇ Mu¸¦ ´à¾Ò°í ÀÌ´Â ¸¶ÀÌÅ©·Î¸¦ ÀǹÌÇϴµ¥ »ç¿ëµÈ´Ù. ÇÔ¼ö°¡ ³¡³¯¶§ timeout¿¡ ³²Àº ½Ã°£ÀÌ ±â·ÏµÉ¼öµµ ÀÖÀ¸¸ç ÀÌ ³»¿ëÀº À¯´Ð½º¸¶´Ù ´Ù¸£±â´Â ÇÏ´Ù.

¿Í¿ì~ ¸¶ÀÌÅ©·Î ÃÊ ´ÜÀ§ÀÇ Å¸À̸Ӹ¦ °¡Áö°Ô µÇ¾ú±º! ¸¸ÀÏ timeval¿¡ ÇʵåµéÀ» 0À¸·Î ä¿ì¸é select()´Â Áï½Ã °á°ú¸¦ µ¹·ÁÁÖ¸ç ÇöÀç setµéÀÇ ³»¿ëÀ» Áï½Ã ¾Ë·ÁÁÖ°Ô µÈ´Ù. timeoutÀ» NULL·Î ¼¼ÆÃÇÏ¸é °áÄÚ ³¡³ªÁö ¾Ê°í °è¼Ó ÆÄÀÏ ±â¼úÀÚ°¡ ÁغñµÇ´Â °ÍÀ» ±â´Ù¸®°Ô µÇ¸ç ³¡À¸·Î ƯÁ¤ÇÑ set¿¡ º¯È­¿¡ °ü½ÉÀÌ ¾ø´Ù¸é ±× Ç׸ñÀ» NULL·Î ÁöÁ¤ÇÏ¸é µÈ´Ù.

´ÙÀ½Àº Á¤±Ô ÀԷ¿¡ ¹«¾ð°¡ ³ªÅ¸³¯ ¶§±îÁö 2.5Ãʸ¦ ±â´Ù¸®´Â ÄÚµåÀÌ´Ù.

       #include <sys/time.h> 
       #include <sys/types.h> 
       #include <unistd.h> 

       #define STDIN 0  /* file descriptor for standard input */

       main()
       {
           struct timeval tv;
           fd_set readfds;

           tv.tv_sec = 2;
           tv.tv_usec = 500000;

           FD_ZERO(&readfds);
           FD_SET(STDIN, &readfds);

           /* don't care about writefds and exceptfds: */
           select(STDIN+1, &readfds, NULL, NULL, &tv);

           if (FD_ISSET(STDIN, &readfds))
               printf("A key was pressed!\n");
           else
               printf("Timed out.\n");
       }


¸¸ÀÏ ÇÑÁÙ¾¿ ¹öÆÛ¸µÇÏ´Â Å͹̳ÎÀ̶ó¸é ¿£ÅÍÅ°¸¦ Ä¡Áö ¾Ê´Â ÀÌ»óÀº ±×³É ŸÀӾƿô¿¡ °É¸± °ÍÀÌ´Ù.

ÀÌÁ¦ ¾Æ¸¶µµ ÀÌ ÈǸ¢ÇÑ ¹æ¹ýÀ» µ¥ÀÌÅͱ׷¥ ¼ÒÄÏ¿¡¼­ µ¥ÀÌÅ͸¦ ±â´Ù¸®´Â µ¥¿¡ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸®¶ó°í »ý°¢ÇÒ °ÍÀÌ´Ù. ¸Â´Ù. ±×·² ¼öµµ ÀÖ´Ù. ¾î¶² À¯´Ð½º¿¡¼­´Â ÀÌ ¹æ¹ýÀÌ µÇÁö¸¸ ¾ÈµÇ´Â °Íµµ ÀÖ´Ù. ÀÚ¼¼ÇÑ °ÍÀº ¸ÇÆäÀÌÁö¸¦ ÂüÁ¶ÇØ¾ß ÇÒ °ÍÀÌ´Ù.

¾î¶² À¯´Ð½ºµéÀº Áß´ÜÇϱâ Àü¿¡ ¾ÆÁ÷ ³²¾ÆÀÖ´Â ½Ã°£ÀÇ ¾çÀ» ¹Ý¿µÇϱâ À§ÇØ ´ç½ÅÀÇ timeval ±¸Á¶Ã¼ ³»ÀÇ ½Ã°£À» °»½ÅÇϱ⵵ ÇÏ°í ¶Ç ¾î¶² °ÍµéÀº ¾Æ´Ï´Ù. À̽ļºÀ» ¿øÇÑ´Ù¸é ±×°Í¿¡ ÀÇÁöÇÏ¸é ¾ÈµÈ´Ù.(¸¸¾à °æ°úÇÑ ½Ã°£À» ÃßÀûÇÒ ÇÊ¿ä°¡ ÀÖ´Ù¸é gettimeofday()¸¦ »ç¿ëÇ϶ó. ³ªµµ ±×°ÍÀÌ °ÔÀ¸¸§¹ðÀ̶ó´Â°ÍÀ» ¾È´Ù. ÇÏÁö¸¸ ±×°Ô ¿ø·¡ ±×·¸´Ù.)

read ÁýÇÕÀÇ ¼ÒÄÏÀÌ ¿¬°áÀ» ²÷´Â´Ù¸é ¾î¶² ÀÏÀÌ »ý±æ±î? À½, ±× °æ¿ì¿¡´Â select()°¡ ¼ÒÄÏ ±â¼úÀÚ¸¦ "ÀÐÀ» Áغñ°¡ µÆÀ½"»óÅ·Π¼³Á¤ÇÏ°í ¹ÝȯµÈ´Ù. ´ç½ÅÀÌ ½ÇÁ¦ÀûÀ¸·Î recv()¸¦ Çϸé recv()´Â 0À» ¹ÝȯÇÒ °ÍÀÌ´Ù. ±×°ÍÀÌ ´ç½ÅÀÌ Å¬¶óÀ̾ðÆ®°¡ ¿¬°áÀ» ²÷¾ú´ÂÁö¸¦ ¾Æ´Â ¹æ¹ýÀÌ´Ù.

select()¿¡ °üÇÑ Èï¹Ì·Î¿î Á¡ ÇÑ°¡Áö: ¸¸¾à ´ç½ÅÀÌ listen()ÇÏ°í ÀÖ´Â ¼ÒÄÏÀ» °¡Áö°í ÀÖ´Ù¸é ±× ¼ÒÄÏÀÇ ÆÄÀϱâ¼úÀÚ¸¦ redfds ÁýÇÕ¿¡ Áý¾î³ÖÀ½À¸·Î½á »õ·Î¿î ¿¬°áÀÌ ÀÖ´ÂÁö¸¦ ¾Ë¾Æº¼ ¼ö ÀÖ´Ù.

±×¸®°í ÀÌ°ÍÀÌ Àü´ÉÇÑ select()ÇÔ¼öÀÇ ´ë·«ÀûÀÎ °³¿äÀÌ´Ù.

ÇÏÁö¸¸ ´ëÁßÀÇ ¿ä±¸¿¡ ÀÇÇؼ­ ¿©±â ½ÉµµÀÖ´Â ¿¹Á¦°¡ ÀÖ´Ù. ºÒÇàÇÏ°Ôµµ, À§ÀÇ ´õ·´°Ô °£´ÜÇÑ ¿¹Á¦¿Í ¿©±âÀÖ´Â °Í°úÀÇ Â÷ÀÌ´Â »ó´çÇÏ´Ù. ÇÏÁö¸¸ ÀÏ´Ü º¸°í ¼³¸íÀ» º¸ÀÚ.

ÀÌ ÇÁ·Î±×·¥Àº °£´ÜÇÑ ´ÙÁß ÀÌ¿ëÀÚ Ã¤Æà ¼­¹öó·³ µ¿ÀÛÇÑ´Ù. ÇϳªÀÇ À©µµ¿ì¿¡¼­ ±×°ÍÀ» ½ÃÀÛÇÏ°í ´Ù¸¥ ¿©·¯°³ÀÇ À©µµ¿ì¿¡¼­ telnet("telnet hostname 9034") Ç϶ó. ´ç½ÅÀÌ ÇϳªÀÇ ÅÚ³Ý ¼¼¼Ç¿¡¼­ ¹«¾ð°¡¸¦ ÀÔ·ÂÇÏ¸é ´Ù¸¥ °Íµé¿¡¼­µµ ±×°ÍÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù.

/*
** selectserver.c -- a cheezy multiperson chat server
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 9034 // port we're listening on

int main(void)
{
    fd_set master;   //master file descriptor list
    fd_set read_fds;  //temp file descriptor list for select()
    struct sockaddr_in myaddr;   //server address
    struct sockaddr_in remoteaddr;  //client addresss
    int fdmax;   //maximum file descriptor number
    int listener;   /listening socket descriptor
    int newfd; //newly accept()ed socket descriptor
    char buf[256];  //buffer for client data
    int nbytes;
    int yes=1;
    int nbytes;
    int yes=1;   //for setsockopt() SO_REUSEADDR, below
    int addrlen;
    int i,j;

    FD_ZERO(&master);    //clear the master and temp sets
    FD_ZERO(&readfds);    

    //get the listener
    if((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        perror("socket");
        exit(1);
    }

    //lose the pesky "address already in use"error message
    if(setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1){
        perror("setsockopt");
        exit(1);
    }

    //bind

    myaddr.sin_family = AF_INET;
    myaddr.sin_addr.s_addr = IN_ADDR_ANY;
    myaddr.sin_port = htons(PORT);
    memset(&(myaddr.sin_zero), '\0',8);    
    if(bind(listener,(struct sockaddr *)&myaddr, sizeof(myaddr)) == -1){
        perror("bind");
        exit(1);
    }

    //listen
    if(listen(listener, 10) == -1){
        perror("listen");
        exit(1);
    }

    //add the listener to the master set
    FD_SET(listener, &master);

    //keep track of the biggest file descriptor
    fdmax = listener; // so far, it's this one

    //main loop
    for(;;){
        read_fds = master; //copy it
        if(select(fdmax+1,&readfds,NULL,NULL,NULL) == -1){
            perror("select");
            exit(1);
        }
        
        //run through the existing connections looking for data to read
        for(i=0;i<=fdmax;i++){
            if(FD_ISSET(i,&read_fds)){  //we got one!!
                if(i==listener){
                    //handle new connections
                    addrlen = sizeof(remoteaddr);
                    if(newfd=accept(listener, (struct sockaddr *)&remoteaddr, &addrlen) == -1){
                        perror("accept");
                        exit(1);
                    }else{
                        FD_SET(newfd,&master); //add to master set
                        if(newfd>fdmax){   /keep track of the maximum
                        fdmax = newfd;
                    }
                    printf("selectserver: new connection form %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd);
                }
            }else{
                //handle data from a client
                if((nbytes = recv(1,buf,sizeof(buf),0)) <= 0){
                    //got error or connection closed by client
                    if(nbytes == 0){
                        //connection closed
                        printf("selectserver: socket %d hungup\n",i);
                    }else{
                        perror("recv");
                    }
                    close(1); //bye!
                    FD_CLR(i, &master); //remove from master set
                }else{
                    //we got some data from a client
                    for(j=0;j<=fdmax;j++){
                        //send to everyone!
                    if(FD_ISSET(j, &master)){
                        //except the listener and ourselves
                        if(j != listenr && j != i){
                            if(send(j,buf,nbytes, 0) == -1){
                            perror("send");
                        }
                    }
                }
            }
        }
    }
    return 0;
}


³»°¡ µÎ°³ÀÇ ÆÄÀÏ ±â¼úÀÚ ÁýÇÕÀ» ¸¸µé¾úÀ½À» ÁÖÀÇÇ϶ó: master¿Í read_fdsÀÌ´Ù. ù¹ø°·Î master´Â »õ·Î¿î ¿¬°áÀ» À§ÇØ ´ë±âÁßÀÎ ¼ÒÄÏ ±â¼úÀÚ¸¦ Æ÷ÇÔÇؼ­ ÇöÀç ¿¬°áµÈ ¸ðµç ¼ÒÄÏ ±â¼úÀÚ¸¦ Æ÷ÇÔÇÑ´Ù.

³»°¡ master ÁýÇÕÀ» ¸¸µç ÀÌÀ¯´Â select()°¡ ¾î¶² ¼ÒÄÏÀÌ ÀоîµéÀÏ Áغñ°¡ µÆ´ÂÁö ¹Ý¿µÇϱâ À§ÇØ ´ç½ÅÀÌ ³Ñ°ÜÁØ ÁýÇÕÀ» º¯°æ½ÃÅ°±â ¶§¹®ÀÌ´Ù. ³»°¡ ÇϳªÀÇ select() È£Ãâ¿¡¼­ ´ÙÀ½ È£Ãâ±îÁöÀÇ ¿¬°áÀ» ÃßÀûÇØ¾ß Çϱ⠶§¹®¿¡, ³ª´Â À̰͵éÀ» ¾ÈÀüÇÏ°Ô ÀúÀåÇØ ³õ¾Æ¾ß ÇÑ´Ù. ¸¶Áö¸· ºÎºÐ¿¡¼­ ³ª´Â master¸¦ read_fds¿¡ º¹»çÇØ ³õ°í select()¸¦ È£ÃâÇß´Ù.

ÇÏÁö¸¸ ÀÌ°ÍÀº »õ·Î¿î ¿¬°áÀ» ÇÒ¶§¸¶´Ù ±×°ÍÀ» master ÁýÇÕ¿¡ Ãß°¡ÇؾßÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÏÁö ¾Ê´Â°¡? ±×·¸´Ù! ±×¸®°í Á¢¼ÓÀÌ ²÷¾îÁú ¶§¸¶´Ù ±×°ÍÀ» master ÁýÇÕ¿¡¼­ Á¦°ÅÇØ¾ß Çϴ°¡? ±×·¸´Ù.

listener ¼ÒÄÏÀ» ÀÐÀ» Áغñ°¡ µÆ´ÂÁö ¾Ë±âÀ§ÇØ ¾ðÁ¦ Á¡°ËÇÏ´ÂÁö¸¦ ÁÖÀÇÇؼ­ º¸¶ó. Á¢¼Ó¿äûÀÌ ¿À¸é ±×°ÍÀ» accept()ÇÏ°í ±×°ÍÀ» master ÁýÇÕ¿¡ Ãß°¡ÇÑ´Ù. ºñ½ÁÇÏ°Ô, Ŭ¶óÀ̾ðÆ®¿ÍÀÇ ¿¬°áÀ» ÀÐÀ» Áغñ°¡ µÇ°í recv()°¡ 0À» ¹ÝȯÇϸé, Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÀ» ²÷¾ú´Ù´Â °ÍÀ» ¾Ë°Ô µÇ°í, ±×°ÍÀ» master ÁýÇÕ¿¡¼­ Á¦°ÅÇØ¾ß ÇÑ´Ù. ¸¸¾à Ŭ¶óÀ̾ðÆ® recv()°¡ 0ÀÌ ¾Æ´Ñ ¼ö¸¦ ¹ÝȯÇÏ¸é ³ª´Â »õ·Î¿î µ¥ÀÌÅÍ°¡ µµÂøÇß´Ù´Â °ÍÀ» ¾Ë°ÔµÈ´Ù. ±×¸®°í ³ª´Â ±×°ÍÀ» ¹Þ¾Æ¼­ master ¸®½ºÆ®¸¦ ÅëÇؼ­ ±× µ¥ÀÌŸ¸¦ ³ª¸ÓÁö ¸ðµç ¿¬°áµÈ Ŭ¶óÀ̾ðÆ®¿¡ º¸³»ÁØ´Ù.

±×¸®°í ÀÌ°ÍÀÌ, Ä£±¸µéÀÌ¿©, °£´ÜÄ¡ ¾ÊÁö¸¸ À§´ëÇÑ select()ÇÔ¼öÀÇ °³¿äÀÌ´Ù.




6.3. ÀϺκÐÀÇ send()µéÀ» ´Ù·ç±â


³»°¡ send()°¡ ´ç½ÅÀÌ ¿äûÇÑ ¸ðµç ¹ÙÀÌÆ®¸¦ send()ÇÏÁö ¾ÊÀ»¼öµµ ÀÖ´Ù°í ÇÑ send()¿¡ °üÇÑ ¼½¼ÇÀ» ±â¾ïÇϴ°¡? ¸¸¾à ´ç½ÅÀÌ 512¹ÙÀÌÆ®¸¦ º¸³»±â¸¦ ¿øÇÒ ¶§ 412°¡ ¸®ÅϵǾú´Ù¸é ³ª¸ÓÁö 100¹ÙÀÌÆ®¿¡°Ô ¾î¶² ÀÏÀÌ ÀϾ´Â°¡?

À½, ±×°ÍµéÀº ¿©ÀüÈ÷ ´ç½ÅÀÇ ÀÛÀº ¹öÆÛ¿¡¼­ ³»º¸³»Áö±â¸¦ ±â´Ù¸®°í ÀÖ´Ù. ´ç½ÅÀÌ ÅëÁ¦ÇÒ ¼ö ÀÖ´Â ¹üÀ§¸¦ ¹þ¾î³ª´Â ȯ°æ ¶§¹®¿¡ Ä¿³ÎÀÌÀÌ ÇÑ µ¢¾î¸®·Î µ¥ÀÌŸ¸¦ ¸ðµÎ º¸³»Áö ¾Ê±â·Î °áÁ¤Çß´Ù¸é, ÀÌÁ¦, Ä£±¸¿©, µ¥ÀÌŸ¸¦ °Å±â·Î ³»º¸³»´Â °ÍÀº ¸ðµÎ ´ç½Å¿¡°Ô ´Þ·ÁÀÖ´Ù.

´ç½ÅÀº ±×°ÍÀ» Çϱâ À§ÇØ ÇÔ¼ö¸¦ ¾Æ·¡¿Í °°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù:

    #include <sys/types.h>
    #include <sys/socket.h>

    int sendall(int s, char *buf, int *len)
    {
        int total = 0;        // how many bytes we've sent
        int bytesleft = *len; // how many we have left to send
        int n;

        while(total < *len) {
            n = send(s, buf+total, bytesleft, 0);
            if (n == -1) { break; }
            total += n;
            bytesleft -= n;
        }

        *len = total; // return number actually sent here

        return n==-1?-1:0; // return -1 on failure, 0 on success
    }



ÀÌ ¿¹Á¦¿¡¼­ s´Â ´ç½ÅÀÌ µ¥ÀÌŸ¸¦ º¸³»±â¸¦ ¿øÇÏ´Â ¼ÒÄÏÀÌ°í, buf´Â µ¥ÀÌŸ¸¦ ´ã°í ÀÖ´Â ¹öÆÛÀ̸ç lenÀº ¹öÆÛ¿¡ ´ã°ÜÀÖ´Â ¹ÙÀÌÆ®¼ö¸¦ ´ã°í ÀÖ´Â int¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù.

ÀÌ ÇÔ¼ö´Â ¿¡·¯½Ã¿¡ -1À» ¹ÝȯÇÑ´Ù(±×¸®°í errno´Â send()È£Ãâ½Ã¿¡ ¼³Á¤µÈ´Ù) ¶ÇÇÑ, ½ÇÁ¦ÀûÀ¸·Î º¸³»Áø ¹ÙÀÌÆ® ¼ö´Â len¿¡ ÀúÀåµÈ´Ù. ÀÌ°ÍÀº ¿À·ù°¡ ¾ø´Ù¸é ´ç½ÅÀÌ º¸³»±â¸¦ ¿äûÇÑ ¹ÙÀÌÆ® ¼ö¿Í °°À» °ÍÀÌ´Ù. sendall()Àº ÃÖ¼±À» ´ÙÇؼ­ µ¥ÀÌŸ¸¦ º¸³¾ °ÍÀÌÁö¸¸ ¸¸¾à ¿À·ù°¡ ÀÖ´Ù¸é ±×°ÍÀº ¹Ù·Î ´ç½Å¿¡°Ô µ¹¾Æ°¥ °ÍÀÌ´Ù.

¿Ïº®À» ±âÇϱâ À§ÇØ À§ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¿¹Á¦µµ ¿©±â ÀÖ´Ù.

    char buf[10] = "Beej!";
    int len;

    len = strlen(buf);
    if (sendall(s, buf, &len) == -1) {
        perror("sendall");
        printf("We only sent %d bytes because of the error!\n", len);
    }

ÆÐŶÀ» ¹Þ´Â ÂÊ¿¡¼­´Â ÆÐŶÀÇ ÇÑ ºÎºÐÀÌ µµÂøÇßÀ» ¶§ ¾î¶² ÀÏÀÌ ÀϾ´Â°¡? ¸¸¾à ±× ÆÐŶÀÌ °¡º¯ÀûÀÎ Å©±â¶ó¸é ¹Þ´Â ÂÊÀº ¾ðÁ¦ ÇϳªÀÇ ÆÐŶÀÌ ³¡³ª°í ¶Ç ´Ù¸¥ °ÍÀÌ ½ÃÀÛµÉÁö ¾Æ´Â°¡? ÀÌ·²¶§´Â Data EncapsulationÀ» ÇؾßÇÑ´Ù.(ÀÌ ±Û ÃʹݺÎÀÇ [http]Data Encapsulation ºÎºÐÀÌ ±â¾ï³ª´Â°¡?) »ó¼¼ÇÑ ¼³¸íÀ» ¿øÇϸé Á» ´õ Àоî¶ó.




6.4. Son of Data Encapsulation


±×·±µ¥ µ¥ÀÌŸ¸¦ ĸ½¶È­ ÇѴٴ°ÍÀº ½ÇÁ¦·Î´Â ¹«¾ùÀ» ÀǹÌÇÒ±î? °¡Àå °£´ÜÇÑ ¿¹·Î, ±×°ÍÀº ´ç½ÅÀÌ °Å±â¿¡ ±¸º°ÇÒ ¼ö ÀÖ´Â ¾î¶² Á¤º¸³ª ÆÐŶ Á¤º¸, ¶Ç´Â ±× µÑ´Ù¸¦ °¡Áø Çì´õ¸¦ ºÙÀÌ´Â °ÍÀ» ¸»ÇÑ´Ù.

´ç½ÅÀÇ Çì´õ´Â ¾î¶² ¸ð¾çÀϱî? À½, ±×°ÍÀº ±×³É ´ç½ÅÀÌ ´ç½ÅÀÇ ÇÁ·ÎÁ§Æ®¸¦ ¿Ï¼ºÇϴµ¥ ÇÊ¿äÇÏ´Ù°í ´À³¢´Â ¾î¶² °ÍÀ̵çÁö Ç¥ÇöÇÒ¼ö ÀÖ´Â ¾î¶² ¹ÙÀ̳ʸ® µ¥ÀÌŸÀÌ´Ù.

¿ì¿Í, ¾Ö¸ÅÇѵ¥.

ÁÁ´Ù. ¿¹¸¦ µé¾î, ´ç½ÅÀÌ SOCK_STREAMÀ» »ç¿ëÇÏ´Â ´ÙÁß »ç¿ëÀÚ Ã¤Æà ÇÁ·Î±×·¥À» ¸¸µç´Ù°í ÇÏÀÚ. À¯Àú°¡ ¾î¶² °ÍÀ» ÀÔ·ÂÇÏ¸é ¼­¹ö¿¡ Àü¼ÛµÉ ¶§ µÎ°¡ÁöÀÇ Á¤º¸°¡ ÇÊ¿äÇÏ´Ù. ¹«¾ùÀ», ´©°¡ ¸»Çߴ°¡ ÀÌ´Ù.

¿©±â±îÁø ±¦ÂúÁö? "¹¹°¡ ¹®Á¦Áö" ¶ó°í ¸»ÇÒÁöµµ ¸ð¸¥´Ù.

¹®Á¦´Â ±× ¸Þ½ÃÁö´Â °¡º¯ÀûÀÎ Å©±â¸¦ °¡Áú¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. "tom"À̶ó´Â ¾î¶²»ç¶÷ÀÌ "Hi"¶ó°í ¸»ÇÏ°í, "Benjamin"À̶ó´Â ¶Ç´Ù¸¥ »ç¶÷ÀÌ "Hey guys what is up?"¶ó°í ¸»ÇÒ ¼ö ÀÖ´Ù.

±×·¡¼­ ´ç½ÅÀº ÀÌ °ÍµéÀÌ µé¾î¿À´Â ´ë·Î ¸ðµç °ÍµéÀ» send()ÇÑ´Ù. ´ç½ÅÀÌ ³»º¸³»´Â µ¥ÀÌŸ ½ºÆ®¸²Àº ÀÌ·¸°Ô º¸ÀÏ °ÍÀÌ´Ù:

tomHiBenjaminHeyguyswhatisup?

µîµî. Ŭ¶óÀ̾ðÆ®°¡ ÇϳªÀÇ ¸Þ½ÃÁö°¡ ¾ðÁ¦ ½ÃÀÛÇÏ°í ³¡³¯Áö ¾î¶»°Ô ¾Æ´Â°¡? ´ç½ÅÀº ¿øÇÑ´Ù¸é ¸ðµç ¸Þ½ÃÁö¸¦ µ¿ÀÏÇÑ Å©±â·Î ¸¸µé¾î¼­ ±×³É À§ÀÇ sendall()À» È£ÃâÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ¿ì¸®´Â "tom"ÀÌ ´ÜÁö "Hi"¶ó°í ¸»Çϴµ¥ 1024 ¹ÙÀÌÆ®¸¦ send()ÇÏ°Ô ÇÏ°í ½ÍÁö ¾Ê´Ù.

±×·¡¼­ ¿ì¸®´Â µ¥ÀÌŸ¸¦ ÀÛÀº Çì´õ¿Í ÆÐŶ±¸Á¶Ã¼¿¡ ĸ½¶È­ ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö µÑ´Ù ÀÌ µ¥ÀÌŸ¸¦ ĸ½¶È­ÇÏ´Â ¹æ¹ý°ú µ¥ÀÌŸ¸¦ »©³»´Â ¹æ¹ýÀ» ¾Ë°í ÀÖ´Ù. ³î¶ø°Ôµµ ¿ì¸®´Â Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö°¡ Åë½ÅÇÏ´Â ¹ýÀ» ¹¦»çÇÏ´Â ÇÁ·ÎÅäÄÝÀ» Á¤ÀÇÇÏ·Á°í ÇÑ´Ù.

ÀÌ ¿¹¿¡¼­, À¯Àú À̸§Àº 8ÀÚÀÇ °íÁ¤±æÀÌ(À̸§ÀÌ 8ÀÚ ¹Ì¸¸À϶§´Â '/0'À¸·Î ä¿öÁö´Â) ¶ó°í °¡Á¤ÇÏÀÚ. ±×¸®°í µ¥ÀÌŸ´Â 128ÀÚ±îÁöÀÇ °¡º¯±æÀ̶ó°í °¡Á¤ÇÏÀÚ. ÀÌÁ¦ ¿ì¸®°¡ ÀÌ °æ¿ì¿¡ »ç¿ëÇÒ ¿¹Á¦ ÆÐŶ ±¸Á¶Ã¼¸¦ »ìÆ캸ÀÚ.

  1. len(1 byte, unsigned) -- ÆÐŶÀÇ ÃÑ ±æÀÌ, 8¹ÙÀÌÆ®ÀÇ À¯Àú À̸§°ú äÆà µ¥ÀÌŸ¸¦ Æ÷ÇÔÇÑ´Ù.
  2. name(8 bytes) -- À¯ÀúÀÇ À̸§, ÇÊ¿äÇÏ´Ù¸é NULL·Î ä¿öÁø´Ù.
  3. chatdata(n-bytes)-- µ¥ÀÌŸ ±× ÀÚü, 128 ¹ÙÀÌÆ® ÀÌÇÏ. ÆÐŶÀÇ ±æÀÌ´Â ÀÌ µ¥ÀÌŸ¿¡ 8(À§ÀÇ À̸§ ÇʵåÀÇ ±æÀÌ)À» ´õÇؼ­ °è»êµÈ´Ù.

¿Ö ³»°¡ Çʵ忡 8¹ÙÀÌÆ®¿Í 128 ¹ÙÀÌÆ®ÀÇ Á¦ÇÑÀ» ¼±ÅÃÇßÀ»±î? ³ª´Â ±×°ÍµéÀÌ ÃæºÐÈ÷ ±æ °Å¶ó°í »ý°¢Çؼ­ º° Àǹ̾øÀÌ ¼±ÅÃÇß´Ù. ¾Æ¸¶µµ ´ç½Å¿¡°Õ 8¹ÙÀÌÆ®°¡ ³Ê¹« Á¦ÇÑÀûÀ̶ó¸é 30¹ÙÀÌÆ®³ª ¾î¶² ±æÀ̵çÁö ´ç½ÅÀÇ name Çʵ带 °¡Áú ¼ö ÀÖ´Ù.

À§ÀÇ ÆÐŶ Á¤ÀǸ¦ »ç¿ëÇϸé ù¹ø° ÆÐŶÀº ¾Æ·¡ÀÇ Á¤º¸·Î ±¸¼ºµÉ °ÍÀÌ´Ù.(hex¿Í ASCII)

0A 746F 6D 00 00 00 00 00 4869
(length) T o m (padding) H i

±×¸®°í µÎ¹ø°´Â ºñ½ÁÇÏ°Ô

14 42 65 6E 6A61 6D 69 6E 48 65 79 20 67 75 79 73 20 77 ...
(length) B e n j a m i n H e y g u y s w ...

(¹°·Ð, ±æÀÌ´Â ³×Æ®¿÷ ¹ÙÀÌÆ® ¼ø¼­·Î ÀúÀåµÈ´Ù. ÀÌ ¿¹Á¦¿¡¼­´Â ÇÑ ¹ÙÀÌÆ® »ÓÀ̹ǷΠ±×°ÍÀº ¹®Á¦°¡ ¾ÈµÇÁö¸¸ ÀϹÝÀûÀ¸·Î ´ç½ÅÀº ¸ðµç ¹ÙÀ̳ʸ® Á¤¼ö°¡ ´ç½ÅÀÇ ÆÐŶ¿¡¼­ ³×Æ®¿÷ ¹ÙÀÌÆ® ¼ø¼­·Î ÀúÀåµÇ°Ô ÇØ¾ß ÇÑ´Ù.

´ç½ÅÀÌ ÀÌ µ¥ÀÌŸ¸¦ º¸³¾ ¶§, ¾ÈÀüÇÏ°Ô Ã³¸®ÇÒ ÇÊ¿ä°¡ ÀÖÀ¸¹Ç·Î ¸¸¾à µ¥ÀÌŸ¸¦ ¸ðµÎ ³»º¸³»´Âµ¥ send()¸¦ ¿©·¯¹ø È£ÃâÇÑ´ÙÇصµ ¸ðµç µ¥ÀÌŸ¸¦ È®½ÇÇÏ°Ô Àü¼ÛÇϱâ À§ÇØ À§ÀÇ sendall()°ú ºñ½ÁÇÑ ¸í·ÉÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.

ºñ½ÁÇÏ°Ô, ÀÌ µ¥ÀÌŸ¸¦ ¼ö½ÅÇÒ ¶§µµ ¾à°£ÀÇ Æ¯º°ÇÑ ÀÛ¾÷À» ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¾ÈÀüÇÏ°Ô Çϱâ À§ÇØ, ´ç½ÅÀº ÆÐŶÀÇ ÇÑ ºÎºÐÀ» ¹Þ¾Ò´Ù°í °¡Á¤ÇØ¾ß ÇÑ´Ù. ¿ì¸®´Â recv()¸¦ °è¼ÓÇؼ­ ÆÐŶÀÌ ¸ðµÎ ¿ÏÀüÇÏ°Ô ¹Þ¾ÆÁú ¶§±îÁö È£ÃâÇØ¾ß ÇÑ´Ù.

ÇÏÁö¸¸ ¾î¶»°Ô? À½, ¿ì¸®´Â ÆÐŶÀ» ¿Ï¼ºÇϱâ À§ÇØ ¹Þ¾Æ¾ß ÇÏ´Â ¹ÙÀÌÆ® ¼ö°¡ ÆÐŶÀÇ ¸Ç ¾Õ¿¡ ºÙ¾îÀÖÀ¸¹Ç·Î ¹Þ¾Æ¾ß ÇÏ´Â ¹ÙÀÌÆ® ¼ö¸¦ ¾Ë°í ÀÖ´Ù. ¿ì¸®´Â ¶ÇÇÑ ÃÖ´ë ÆÐŶ »çÀÌÁî°¡ 1+8+128 ¶Ç´Â 137À̶ó´Â °Íµµ ¾Ë°í ÀÖ´Ù. (¿Ö³ÄÇÏ¸é ¿ì¸®°¡ ÆÐŶÀ» ±×·¸°Ô Á¤ÀÇÇßÀ¸´Ï±î.)

´ç½ÅÀÌ ÇÒ ¼ö ÀÖ´Â ÀÏÀº µÎ°³ÀÇ ÆÐŶÀ» ¹Þ¾ÆµéÀÏ ¼ö ÀÖÀ»¸¸Å­ ÃæºÐÈ÷ Å« ¹è¿­À» ¼±¾ðÇÏ´Â °ÍÀÌ´Ù. ±×°ÍÀÌ ÆÐŶµéÀÌ µµÂøÇÒ¶§ Á¶¸³ÇÒ ÀÛ¾÷ ¹è¿­ÀÌ´Ù.

´ç½ÅÀÌ µ¥ÀÌŸ¸¦ recv() ÇÒ ¶§¸¶´Ù ´ç½ÅÀº ±×°ÍÀ» ÀÛ¾÷ ¹öÆÛ¿¡ ³Ö°í ÆÐŶÀÌ ¿Ï·áµÇ¾ú´ÂÁö ¾Ë¾Æ³»¾ß ÇÑ´Ù. ÆÐŶ Àü¼ÛÀÌ ¿Ï·áµÇ¾ú´Ù¸é ±× ¹öÆÛ ³»ÀÇ ¹ÙÀÌÆ® ¼ö°¡ Çì´õ¿¡ ÁöÁ¤µÈ ±æÀÌ(+1, ¿Ö³ÄÇϸé Çì´õ ³»ÀÇ ±æÀÌ´Â ±æÀÌ ±× ÀÚü¸¦ ³ªÅ¸³»´Â ¹ÙÀÌÆ®´Â Æ÷ÇÔÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù)º¸´Ù Å©°Å³ª °°´Ù. ¸¸¾à ¹öÆÛ³»ÀÇ ¹ÙÀÌÆ® ¼ö°¡ 1º¸´Ù ÀÛ´Ù¸é, ÆÐŶÀº ¸í¹éÇÏ°Ô ¿Ï¼ºµÇÁö ¾ÊÀº °ÍÀÌ´Ù. ÇÏÁö¸¸ ´ç½ÅÀº ù¹ø° ¹ÙÀÌÆ®°¡ À߸øµÇ¼­ Á¤È®ÇÑ ÆÐŶ ±æÀ̸¦ ±¸ÇÒ ¼ö ¾ø´Â ÀÌ·± °æ¿ì¿¡ ´ëºñÇؼ­ Ưº°ÇÑ ´ëºñ¸¦ ÇØ¾ß ÇÑ´Ù.

ÀÏ´Ü ÆÐŶÀÌ ¿Ï¼ºµÇ¸é, ´ç½ÅÀº ±×°ÍÀ» °¡Áö°í ÇÏ°í ½ÍÀº´ë·Î ÇÒ ¼ö ÀÖ´Ù. ±×°ÍÀ» »ç¿ëÇÏ°í ÀÛ¾÷ ¹öÆÛ¿¡¼­ Áö¿ö¹ö·Á·ª.

ÈÞ! ¾ÆÁ÷µµ ´ç½ÅÀÇ ¸Ó¸´ ¼Ó¿¡¼­ ÀÌÇØÇÏ·Á°í ¾Ö¾²°í ÀÖ³ª? À½, ¿©±â ¿ø-Åõ ÆÝÄ¡ÀÇ µÎ¹ø°°¡ ÀÖ´Ù: ´ç½ÅÀº ÇϳªÀÇ ÆÐŶÀÇ ³¡À» Áö³ª¼­ ´ÙÀ½ ÆÐŶÀ» ÇϳªÀÇ recv() È£Ãâ¿¡¼­ ÀÐ¾î µé¿´À» ¼öµµ ÀÖ´Ù. ±×°ÍÀº ÇϳªÀÇ ¿ÏÀüÇÑ ÆÐŶ°ú ´ÙÀ½ ÆÐŶÀÇ ºÒ¿ÏÀüÇÑ ÆÐŶÀÌ ÀÛ¾÷ ¹öÆÛ¿¡ ÀÖ´Â °ÍÀÌ´Ù! (ÇÏÁö¸¸ ÀÌ°ÍÀÌ ÀÛ¾÷ ¹öÆÛ¸¦ µÎ°³ÀÇ ÆÐŶÀ» °¡Áú Á¤µµ·Î Å©°Ô ¸¸µé¾î ³õ¾Æ¾ß ÇÏ´Â ÀÌÀ¯ÀÌ´Ù.)

´ç½ÅÀÌ Ã¹¹ø° ÆÐŶÀÇ ±æÀ̸¦ Çì´õ¿¡¼­ ¾Ë ¼ö Àֱ⠶§¹®¿¡ ÀÛ¾÷ ¹öÆÛ ³»ÀÇ ¹ÙÀÌÆ® ¼ö¸¦ ¾Ë¾Æ³»¼­, »©±â¸¦ ÇÏ¸é µÎ¹ø°(ºÒ¿ÏÀüÇÑ) ÆÐŶÀÌ ÀÛ¾÷ ¹öÆÛ¿¡¼­ ¾ó¸¶³ª ¸¹ÀÌ ¼ÓÇÏ°í ÀÖ´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ´ç½ÅÀÌ Ã¹¹ø°¸¦ ó¸®ÇÏ°í ³ª¸é ±×°ÍÀ» ÀÛ¾÷ ¹öÆÛ¿¡¼­ Áö¿ì°í ³ª¼­ µÎ¹ø° ÆÐŶ ºÎºÐÀ» ¹öÆÛÀÇ ¾Õ ÂÊÀ¸·Î ´ç±â¸é ´ÙÀ½ recv()¿¡ ´ëÇØ ´ëºñÇÒ ¼ö ÀÖ´Ù.

(µ¶ÀÚµé Áß ¸î¸îÀº ½ÇÁ¦ÀûÀ¸·Î ºÎºÐÀûÀÎ µÎ¹ø° ÆÐŶÀ» ÀÛ¾÷ ¹öÆÛÀÇ ¾ÕÂÊÀ¸·Î ¿Å±â´Â °ÍÀÌ ½Ã°£ÀÌ °É¸®°í ÇÁ·Î±×·¥¿¡¼­ ¼øȯ ¹öÆÛ¸¦ »ç¿ëÇÏ¸é ¿Å±æ ÇÊ¿ä°¡ ¾ø°Ô ÄÚµùÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë°í ÀÖÀ»°ÍÀÌ´Ù. ³ª¸ÓÁö µ¶Àڵ鿡°Ô´Â ºÒÇàÇÏ°Ôµµ, ¼øȯ¹öÆÛ¿¡ ´ëÇÑ ÅäÀÇ´Â ÀÌ ±ÛÀÇ ¹üÀ§¸¦ ¹þ¾î³­´Ù. ¸¸¾à ¾ÆÁ÷ ±Ã±ÝÇÏ´Ù¸é µ¥ÀÌŸ ±¸Á¶·Ð Ã¥À» ÀÐ°í °Å±â¼­ ´õ ¾Ë¾Æº¸¶ó.)

³ª´Â ÀÌ°ÍÀÌ ½±´Ù°í ÇÏÁö´Â ¾Ê¾Ò´Ù. ÁÁ´Ù, ³»°¡ ½¬¿ï °ÍÀ̶ó°í Çß´Ù. ±×¸®°í ½ÇÁ¦·Î ±×·¸´Ù; ´ç½Å¿¡°Õ ´ÜÁö ¿¬½ÀÀÌ ÇÊ¿äÇÒ »ÓÀÌ°í °ð ±×°ÍµéÀÌ ÀÚ¿¬½º·´°Ô ´Ù°¡¿Ã °ÍÀÌ´Ù. ¿¢½ºÄ®¸®¹ö¿¡ °É°í ¸Í¼¼ÇÑ´Ù!


7. Âü°í»çÇ×

¿©±â±îÁö ¿Í¼­´Â ¾Æ¸¶ Á»´õ »õ·Î¿î ´Ù¸¥ °ÍÀº ¾ø´Â°¡ ÇÒ °ÍÀÌ´Ù. ¶Ç ¾îµð¼­ ´Ù¸¥ ¹«¾ð°¡¸¦ ´õ ãÀ» ¼ö Àִ°¡¸¦ ¾Ë°íÀÚ ÇÒ °ÍÀÌ´Ù.

7.1. ¸Ç ÆäÀÌÁö

Ãʺ¸ÀÚ¶ó¸é ´ÙÀ½ÀÇ ¸ÇÆäÀÌÁö¸¦ Âü°íÇÏ´Â °Íµµ ÁÁ´Ù.

socket()

bind()

connect()

listen()

accept()

send()

recv()

sendto()

recvfrom()

close()

shutdown()

getpeername()

getsockname()

gethostbyname()

gethostbyaddr()

getprotobyname()

fcntl()

select()

perror()

7.2. Âü°í ¼­Àû

´ÙÀ½ Ã¥µéµµ µµ¿òÀÌ µÉ°ÍÀÌ´Ù.

Internetworking with TCP/IP, volumes I-III
by Douglas E. Comer and David L. Stevens. Published by Prentice Hall. Second edition ISBNs: 0-13-468505-9, 0-13-472242-6, 0-13-474222-2. There is a third edition of this set which covers IPv6 and IP over ATM.


Using C on the UNIX System
by David A. Curry. Published by O'Reilly & Associates, Inc. ISBN 0-937175-23-4.


TCP/IP Network Administration
by Craig Hunt. Published by O'Reilly & Associates, Inc. ISBN 0-937175-82-X.


TCP/IP Illustrated, volumes 1-3
by W. Richard Stevens and Gary R. Wright. Published by Addison Wesley. ISBNs: 0-201-63346-9, 0-201-63354-X, 0-201-63495-3.

Unix Network Programming
by W. Richard Stevens. Published by Prentice Hall. ISBN 0-13-949876-1.


7.3. À¥ »óÀÇ Âü°í¼­


À¥ »ó¿¡´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖÀ» °ÍÀÌ´Ù.

BSD Sockets: A Quick And Dirty Primer (http://www.cs.umn.edu/~bentlema/unix/--has other great Unix system programming info, too!)


Intro to TCP/IP (gopher) (gopher://gopher-chem.ucdavis.edu/11/Index/Internet_aw/Intro_the_Internet/intro.to.ip/)

Internet Protocol Frequently Asked Questions (France) (http://web.cnam.fr/Network/TCP-IP/)

The Unix Socket FAQ (http://www.ibrado.com/sock-faq/)


7.4. RFC


²ûÂïÇÏÁö¸¸..RFCµµ ºÁ¾ß ÇÏ°Ú´Ù.

RFC-768 -- The User Datagram Protocol (UDP) (ftp://nic.ddn.mil/rfc/rfc768.txt)

RFC-791 -- The Internet Protocol (IP) (ftp://nic.ddn.mil/rfc/rfc791.txt)

RFC-793 -- The Transmission Control Protocol (TCP) (ftp://nic.ddn.mil/rfc/rfc793.txt)

RFC-854 -- The Telnet Protocol (ftp://nic.ddn.mil/rfc/rfc854.txt)

RFC-951 -- The Bootstrap Protocol (BOOTP) (ftp://nic.ddn.mil/rfc/rfc951.txt)

RFC-1350 -- The Trivial File Transfer Protocol (TFTP) (ftp://nic.ddn.mil/rfc/rfc1350.txt)



8. ¸¹ÀÌ ÇÏ´Â Áú¹®µé


  • Q:ÀÌ·± Çì´õÆÄÀϵéÀº ¾îµð¼­ ¾òÁÒ? A:¸¸¾à ´ç½ÅÀÌ ´ç½ÅÀÇ ½Ã½ºÅÛ¿¡ ÀÌ¹Ì °®°í ÀÖÁö ¾Ê´Ù¸é ¾Æ¸¶ ±×°ÍµéÀÌ ÇÊ¿ä¾øÀ» °ÍÀÌ´Ù. ´ç½ÅÀÇ Ç÷§ÆûÀ» À§ÇÑ ¸Å´º¾óÀ» ã¾Æº¸¶ó. ¸¸¾à ´ç½ÅÀÌ À©µµ¿ìÁ À§ÇØ ¸¸µé°íÀÚ ÇÑ´Ù¸é ´ÜÁö #include <winsock.h>¸¸ ÀÖÀ¸¸é µÈ´Ù.
  • Q:bind()°¡ "Address already in use"¸¦ º¸°íÇÑ´Ù¸é ¾îÂîÇØ¾ß Çϴ°¡? A:listening ¼ÒÄÏ¿¡ SO_REUSEADDR¿É¼Ç°ú ÇÔ²² setsockopt()¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. bind() ¼½¼Ç°ú select()¼½¼ÇÀ» Âü°íÇ϶ó.
  • Q:½Ã½ºÅÛ»ó¿¡ ¿­¸°¼ÒÄÏÀÇ ¸®½ºÆ®´Â ¾î¶»°Ô ¾òÀ» ¼ö Àִ°¡? A:netstat¸¦ »ç¿ëÇ϶ó. ÀÚ¼¼ÇÑ °ÍÀº manÆäÀÌÁö¸¦ Âü°íÇ϶ó. ÇÏÁö¸¸ ±×³É ¾Æ·¡¿Í °°ÀÌ ÀÔ·ÂÇصµ ¾µ¸¸ÇÑ Ãâ·ÂÀ» ¾òÀ» ¼ö ÀÖ´Ù.

 $netstat

  • Q:¶ó¿ìÆà Å×À̺íÀ» ¾î¶»°Ô º¼ ¼ö Àִ°¡? A:route(´ëºÎºÐÀÇ ¸®´ª½º¿¡¼­ /sbin¿¡ ÀÖ´Ù) ¸í·ÉÀ» ½ÇÇàÇϰųª netstat -rÀ» ½ÇÇàÇ϶ó.
  • Q:¸¸¾à ³»°¡ ´Ü ÇϳªÀÇ ÄÄÇ»Å͸¸ °¡Áö°í ÀÖ´Ù¸é ¾î¶»°Ô Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö ÇÁ·Î±×·¥À» ½ÇÇà ½Ãų ¼ö Àִ°¡? ³×Æ®¿÷ ÇÁ·Î±×·¥À» À§Çؼ­´Â ³×Æ®¿÷ÀÌ ÇÊ¿ä ¾ø´Â°¡? A:´ÙÇེ·´°Ôµµ, °¡»óÀûÀ¸·Î ¸ðµç ÄÄÇ»ÅÍ´Â Ä¿³Î»ó¿¡ µé¾î¾É¾Æ¼­ ³×Æ®¿÷Ä«µåÀΠô ÇÏ´Â ·çÇÁ¹é ³×Æ®¿÷ "ÀåÄ¡"¸¦ ±¸ÇöÇØ ³õ¾Ò´Ù.(ÀÌ°ÍÀº ¶ó¿ìÆà Å×ÀÌºí¿¡¼­ "lo"¶ó°í ³ª¿­µÈ ÀÎÅÍÆäÀ̽º ÀÌ´Ù)

    ´ç½ÅÀÌ "goat"¶ó´Â ±â°è¿¡ ·Î±×ÀÎÇß´Ù°í ÇÑ´Ù¸é. ÇϳªÀÇ Ã¢¿¡¼­ Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇàÇÏ°í ´Ù¸¥ â¿¡¼­´Â ¼­¹ö¸¦ ½ÇÇàÇ϶ó. ¾Æ´Ï¸é ¼­¹ö¸¦ ¹é±×¶ó¿îµå¿¡¼­ ½ÇÇàÇÏ°í("server &") °°Àº â¿¡¼­ Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇàÇ϶ó. ·çÇÁ¹é µð¹ÙÀ̽ºÀÇ °á°ú´Â client goat ¶Ç´Â client localhost( "localhost"°¡ ´ç½ÅÀÇ /etc/hosts ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´ÂÇÑ)ÀÌ°í ´ç½ÅÀº ³×Æ®¿÷ ¾øÀÌ Å¬¶óÀ̾ðÆ®°¡ ¼­¹ö¿¡°Ô À̾߱â ÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.

    ª°Ô ¸»Çؼ­, ÇϳªÀÇ ³×Æ®¿÷¿¡ ¿¬°áµÇÁö ¾ÊÀº ±â°è¿¡¼­ ½ÇÇàÇϱâ À§Çؼ­ ¾î¶² Äڵ嵵 ¹Ù²Ü ÇÊ¿ä°¡ ¾ø´Ù.
  • Q: ¹Ý´ëÆíÀÌ ¿¬°áÀ» ²÷¾ú´ÂÁö ¾î¶»°Ô ¾Ë¼ö ÀÖ³ª? A:recv()°¡ 0À» ¹ÝȯÇÏ¸é ¾Ë ¼ö ÀÖ´Ù.
  • Q:"ping" À¯Æ¿¸®Æ¼´Â ¾î¶»°Ô ±¸ÇöÇÒ ¼ö ÀÖ³ª? ICMP´Â ¹«¾ùÀΰ¡? ¾îµð¼­ raw¼ÒÄÏ°ú SOCK_RAW¿¡ ´ëÇؼ­ ´õ ¾Ë ¼ö ÀÖ³ª? A:´ç½ÅÀÇ raw ¼ÒÄÏ¿¡ °üÇÑ ¸ðµç Áú¹®Àº W. Richard Stevens ÀÇ UNIX Network ProgrammingÃ¥µé¿¡¼­ ´äÀ» ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ ¾È³»¼­ÀÇ Ã¥¿¡ °üÇÑ ¼½¼ÇÀ» º¸¶ó
  • Q:À©µµ¿ìÁî¿ëÀº ¾î¶»°Ô ¸¸µé ¼ö ÀÖ³ª? A:ù¹ø°·Î, À©µµ¿ìÁ Áö¿ì°í Linux³ª BSD¸¦ ¼³Ä¡Ç϶ó. );-). ¾Æ´Ï´Ù. ´ÜÁö ÃʹÝÀÇ À©µµ¿ìÁî¿ëÀ¸·Î °³¹ßÇϱ⠼½¼ÇÀ» º¸¶ó.
  • Q:Solaris/SunOS¿ëÀ¸·Î ¾î¶»°Ô °³¹ßÇÒ ¼ö ÀÖ³ª? ÄÄÆÄÀÏ ÇÏ·Á°í Çϸé linker¿¡·¯°¡ ¹ß»ýÇÑ´Ù. A:linker¿¡·¯´Â ¼± ¹Ú½ºµéÀÌ ¼ÒÄÏ ¶óÀ̺귯¸®¿¡¼­ ÀÚµ¿ÀûÀ¸·Î ÄÄÆÄÀÏ ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÃʹݺÎÀÇ Solaris/SunOS¿ëÀ¸·Î °³¹ßÇϱ⠼½¼ÇÀ» º¸¶ó.
  • Q:¿Ö select()°¡ ½Ã±×³Î¿¡ ÁߴܵǴ°¡? A:½Ã±×³ÎÀº ºí·ÏµÈ ½Ã½ºÅÛ ÄÝÀÌ errno¸¦ EINTR·Î ¼³Á¤ÇÏ°í -1À» ¹ÝȯÇÏ°Ô ¸¸µç´Ù. ´ç½ÅÀÌ sigaction()À¸·Î ½Ã±×³Î Çڵ鷯¸¦ ¼³Á¤ÇÒ¶§ ´ç½ÅÀº ½Ã½ºÅÛ ÄÝÀÌ ÀÎÅÍ·´Æ® µÈ ÈÄ¿¡ Àç½ÃÀÛ ÇÏ°Ô ÇØÁÖ´Â SA_RESTART Ç÷¡±×¸¦ ¼³Á¤ ÇÒ ¼ö ÀÖ´Ù.

    ´ç¿¬È÷, ÀÌ°ÍÀº Ç×»ó µ¿ÀÛÇÏ´Â °ÍÀº ¾Æ´Ï´Ù.

    ³»°¡ ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ °¡Àå ÁÁ¾ÆÇÏ´Â ÇØ°á¹ýÀº goto¹®ÀåÀÌ´Ù. ´ç½Åµµ ÀÌ°ÍÀÌ ´ç½ÅÀÇ ±³¼öµéÀ» ±¦½Ã¸® Â¥Áõ³ª°Ô ÇÒ°ÍÀ̶ó´Â°ÍÀº ¾Ë°ÍÀÌ´Ù. ±×·¡µµ ÀÏ´Ü Çغ¸¶ó!

    select_restart:
    if((err=select(fdmax+1, &readfds, NULL,NULL,NULL)) == -1){
        if(errno == EINTR){
        //some signal just interrupted us, so restart
        goto select_restart;
        }
    //handle the real error here:
    perror("select");
    }

È®½ÇÈ÷ ´ç½ÅÀº ¿©±â¼­ goto¹®À» ½á¾ßÇÒ ÇÊ¿ä´Â ¾ø´Ù; ÀÌ°ÍÀ» ó¸®Çϱâ À§ÇØ ´Ù¸¥ ±¸Á¶¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ³ª´Â ÀÌ ¹æ¹ý

ÀÌ ½ÇÁúÀûÀ¸·Î Á¦ÀÏ ±ú²ýÇÏ´Ù°í »ý°¢ÇÑ´Ù.


  • Q:recv()½Ã¿¡ ½Ã°£Á¦ÇÑÀ» ¾î¶»°Ô ±¸ÇöÇÒ¼ö Àִ°¡? A:select()¸¦ »ç¿ëÇ϶ó! ±×°ÍÀº ´ç½ÅÀÌ ÀоîµéÀÌ·Á°íÇÏ´Â ¼ÒÄϱâ¼úÀÚ¸¦ À§ÇÑ timeout ¸Å°³º¯¼ö¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ¶Ç´Â ¾Æ·¡Ã³·³ ÇϳªÀÇ ÇÔ¼ö¿¡ ¸ðµç ±â´ÉÀ» Áý¾î³ÖÀ» ¼öµµ ÀÖ´Ù.

#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>

int recvtimeout(int s, char *buf,int len, int timeout)
{
    fd_set fds;

    int n;
    struct timeval tv;

    //set up the file descriptor set
    FD_ZERO(&fds);
    FD-SET(s,&fds);

    //set up the struct timeval for the timeout
    tv.tv_sec = timeout;
    tv.tv_usec = 0;

    //wait until timeout or data received
    n=select(s+1,&fds,NULL,NULL,&tv);
    if(n==0) return -2; //timeout!
    if(n==-1) return -1; //error

    //data must be here, so do a normal recv()
    return recv(s,buf,len,0);
}

    //sample call to recvtimeout();

.
.
    n=recvtimeout(s,buf,sizeof(buf),10); //10second timeout

    if(n == -1){
    //error occurred
    }else{
    //got some data in buf
    }
.
.

recvtimeout()ÀÌ ½Ã°£Á¾·á½Ã¿¡ -2¸¦ ¹ÝȯÇÏ´Â °Í¿¡ ÁÖÀÇÇ϶ó. ¿Ö 0À» ¹ÝȯÇÏÁö ¾ÊÀ»±î? À½, ȸ»óÇغ¸¸é recv()È£Ãâ½Ã¿¡ 0ÀÇ ¹Ýȯ°ªÀº ¿ø°Ý ¿¬°áÁö¿¡¼­ Á¢¼ÓÀ» ²÷¾ú´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ±×·¡¼­ ¹Ýȯ°ª -1Àº "error"¸¦ ÀǹÌÇϵµ·Ï ¼±¾ðµÇ¾ú±â ¶§¹®¿¡ ³ª´Â -2¸¦ ½Ã°£ Á¾·á¸¦ ÀǹÌÇϵµ·Ï ÁöÁ¤Çß´Ù.


  • Q:¾î¶»°Ô µ¥ÀÌŸ¸¦ ¼ÒÄÏÀ» ÅëÇØ º¸³»±â Àü¿¡ ¾ÐÃàÇϰųª ¾Ïȣȭ ÇÒ ¼ö ÀÖ³ª A:ÇϳªÀÇ ½¬¿î ¹æ¹ýÀº SSL(secure sockets layer)¸¦ ÀÌ¿ëÇϴ°ÍÀÌÁö¸¸, ÀÌ ¾È³»¼­ÀÇ ¹üÀ§¸¦ ¹þ¾î³­´Ù. ÇÏÁö¸¸ ´ç½ÅÀÌ ´ç½ÅÀÇ ¾ÐÃà±â³ª ¾Ïȣȭ ½Ã½ºÅÛÀ» ³¢¿ö³Ö°Å³ª ±¸ÇöÇÑ´Ù°í °¡Á¤ÇÏ¸é µ¥ÀÌŸ°¡ ¾ç ³¡´ÜÀ» ¿À°¡´Â ¼ø¼­»óÀÇ Â÷ÀÌÀÏ»ÓÀÌ´Ù. µ¥ÀÌŸ´Â °¢°¢ÀÇ ´Ü°è¸¦ Áö³ª¸é¼­ ¾î¶²½ÄÀ¸·Îµç ¹Ù²î°Ô µÈ´Ù.
    1. ¼­¹ö°¡ ÆÄÀÏ(¶Ç´Â ¾îµð¿¡¼­µçÁö)¿¡¼­ µ¥ÀÌŸ¸¦ ÀоîµéÀδÙ.
    2. ¼­¹ö°¡ µ¥ÀÌŸ¸¦ ¾ÏȣȭÇÑ´Ù.(´ç½ÅÀÌ ÀÌ ºÎºÐÀ» ´õÇÑ´Ù)
    3. ¼­¹ö°¡ ¾ÏȣȭµÈ µ¥ÀÌŸ¸¦ send()ÇÑ´Ù.

  • ÀÌÁ¦ ¹Ý´ëÆí¿¡¼­´Â

    1. Ŭ¶óÀ̾ðÆ®°¡ ¾ÏȣȭµÈ µ¥ÀÌŸ¸¦ recv()ÇÑ´Ù.
    2. Ŭ¶óÀ̾ðÆ®°¡ µ¥ÀÌŸ¸¦ Çص¶ÇÑ´Ù(´ç½ÅÀÌ ÀÌ ºÎºÐÀ» ³¢¿ö ³Ö´Â´Ù.)
    3. Ŭ¶óÀ̾ðÆ®°¡ µ¥ÀÌŸ¸¦ ÆÄÀÏ(¶Ç´Â ¾î¶²°÷À̵çÁö)¿¡ ±â·ÏÇÑ´Ù.

    ¶Ç ´ç½ÅÀº ¾Ïȣȭ/Çص¶¸¦ ÇÏ´Â ¶È°°Àº ÁöÁ¡¿¡¼­ ¾ÐÃàÀ» ÇÒ ¼ö ÀÖ´Ù. ¶Ç´Â ´ç½ÅÀº µÑ ´Ù ÇÒ ¼öµµ ÀÖ´Ù! ´ÜÁö ¾Ïȣȭ ÇϱâÀü¿¡ ¾ÐÃàÇؾßÇÑ´Ù´Â °ÍÀ» ÀØÁö¸¶¶ó.

    Ŭ¶óÀ̾ðÆ®°¡ ¼­¹ö°¡ ÇÑ°ÍÀ» ¹«È¿È­ ÇÒ ¼ö¸¸ ÀÖ´Ù¸é ¾ó¸¶³ª ¸¹Àº Áß°£´Ü°è¸¦ ´õÇÑ´ÙÇصµ ±× µ¥ÀÌŸ´Â °á±¹¿¡´Â º¯ÇÔ¾øÀ» °ÍÀÌ´Ù ±×·¡¼­ ´ç½ÅÀÌ ³» Äڵ带 »ç¿ëÇϱâÀ§ÇØ ÇÊ¿äÇÑ °ÍÀº µ¥ÀÌŸ°¡ ÀÐÇôÁö°í ³×Æ®¿÷À» ÅëÇØ º¸³»¾îÁö´Â(send()¸¦ »ç¿ëÇؼ­) Áß°£¿¡ ¾Ïȣȭ Äڵ带 ³¢¿ö³ÖÀ» ¸¸ÇÑ Àå¼Ò¸¦ ã´Â °ÍÀÌ´Ù.
  • Q:³»°¡ °è¼Ó º¸°í ÀÖ´Â PF_INETÀº ¹«¾ùÀΰ¡? AF_INET°ú °ü°èÀִ°ÍÀΰ¡? A:±×·¸´Ù. ÀÚ¼¼ÇÑ°ÍÀº socket()¼½¼ÇÀ» º¸¶ó.
  • Q:Ŭ¶óÀ̾ðÆ®¿¡¼­ ½© ¸í·É¾î¸¦ ¹Þ¾Æ¼­ ½ÇÇàÇÏ´Â ¼­¹ö¸¦ ¾î¶»°Ô ¸¸µé ¼ö ÀÖ³ª? A:°£´ÜÈ÷ ¸»Çؼ­, Ŭ¶óÀ̾ðÆ®°¡ connect()ÇÏ°í send()ÇÏ°í ¿¬°áÀ» close()ÇÑ´Ù¸é(±×°ÍÀº Ŭ¶óÀ̾ðÆ®°¡ ´Ù½Ã Á¢¼ÓÇÏÁö ¾Ê°í´Â ¿¬¼ÓÀûÀÎ ½Ã½ºÅÛ È£ÃâÀÌ ¾ø´Ù´Â °ÍÀÌ´Ù.)

    Ŭ¶óÀ̾ðÆ®ÂÊÀÇ Ã³¸®¼ø¼­´Â ´ÙÀ½°ú °°´Ù:

    1. ¼­¹ö¿¡ connect()
    2. send()("/sbin/ls > tmp/client.out");
    3. ¿¬°áÀ» close()

  • ¹Ý¸é¿¡ ¼­¹ö´Â µ¥ÀÌŸ¸¦ ó¸®ÇÏ°í ½ÇÇàÇÑ´Ù.

    1. Ŭ¶óÀ̾ðÆ®¿¡°Ô¼­ accept()
    2. ¸í·É¾î ¹®ÀÚ¿­À» recv(str)
    3. ¿¬°áÀ» close()
    4. ¸í·ÉÀ» ½ÇÇàÇϱâ À§ÇØ system(str)

    ÁÖÀÇ! ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®°¡ ¸»ÇÏ´Â °ÍÀ» ½ÇÇàÇÑ´Ù´Â °ÍÀº ¿ø°Ý ½© Á¢±ÙÀ» Çã¿ëÇÑ´Ù´Â °ÍÀÌ°í »ç¶÷µéÀÌ ±×µéÀÌ Á¢¼ÓÇÑ ¼­¹ö¿¡ Á¢¼ÓÇؼ­ ´ç½ÅÀÇ °èÁ¤¿¡ ¹«½¼ÀÏÀ̵ç ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î, À§ÀÇ ¿¹¿¡¼­, Ŭ¶óÀ̾ðÆ®°¡ "rm -rf"¸¦ Àü¼ÛÇÑ´Ù¸é ¾î¶»°Ô µÉ±î? ±×°ÍÀº ´ç½Å °èÁ¤ÀÇ ¸ðµç°ÍÀ» Áö¿ö ¹ö¸±°ÍÀÌ´Ù!

    ±×·¯´Ï ¸¸¾à ´ç½ÅÀÌ Çö¸íÇÏ´Ù¸é, ´ç½ÅÀÌ foobaró·³ ¾ÈÀüÇÏ´Ù°í »ý°¢ÇÏ´Â ¸î¸îÀÇ À¯Æ¿¸®Æ¼¿Ü¿¡´Â »ç¿ëÀ» ±ÝÁöÇØ¾ß ÇÑ´Ù.

 if(!strcmp(str,"foobar")){
    sprintf(sysstr, "%s > /tmp/server.out",str);
    system(sysstr);
}

ÇÏÁö¸¸ ºÒÇàÇÏ°Ôµµ À̰͵µ ¾ÈÀüÇÏÁö ¾Ê´Ù: ¸¸¾à Ŭ¶óÀ̾ðÆ®°¡ "foobar; rm -rf ~"¸¦ ÀÔ·ÂÇÑ´Ù¸é? °¡Àå ¾ÈÀüÇÑ °ÍÀº ¸í·É¾î¸¦ À§ÇÑ ¿É¼ÇÀÇ ¾ËÆĺª°ú ¼ýÀÚ¸¦ Á¦¿ÜÇÑ ¸ðµç ¹®ÀÚ(½ºÆäÀ̽ºµµ Æ÷ÇÔÇؼ­)ÀÇ ¾Õ¿¡ À̽ºÄÉÀÌÇÁ("\") ¹®ÀÚ¸¦ Áý¾î³Ö´Â °ÍÀÌ´Ù.

º¸´Ù½ÃÇÇ ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®°¡ º¸³»Áִ¸í·ÉÀ» ½ÇÇàÇÏ°Ô ¸¸µç´Ù¸é º¸¾ÈÀÌ ¾ÆÁÖ Å« ¹®Á¦°¡ µÈ´Ù.
  • Q:³ª´Â ¸¹Àº µ¥ÀÌŸ¸¦ º¸³»´Â ÁßÀε¥ ³»°¡ recv()ÇßÀ»¶§ ±×°ÍÀº ´ÜÁö Çѹø¿¡ 536¹ÙÀÌÆ®³ª 1460¹ÙÀÌÆ®¹Û¿¡ ¹ÞÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ³» ·ÎÄà ¸Ó½Å¿¡¼­ ½ÇÇà½ÃÅ°¸é ±×°ÍÀº Çѹø¿¡ ¸ðµç µ¥ÀÌŸ¸¦ ¹Þ´Â´Ù. ¾î¶»°Ô µÈ°Ç°¡? A: MTU ¹®Á¦´Ù. MTU´Â ¹°¸®ÀûÀÎ ¸Åü°¡ Ãë±ÞÇÒ¼ö ÀÖ´Â ÃÖ´ëÀÇ Å©±âÀε¥ ·ÎÄà ¸Ó½Å¿¡¼­´Â 8K³ª ±×ÀÌ»óÀ» ·çÇÁ¹éÀ» »ç¿ëÇؼ­ ó¸®Çصµ ¹®Á¦¾ø´Ù. ÇÏÁö¸¸ Çì´õ¸¦ Æ÷ÇÔÇؼ­ 1500 ¹ÙÀÌÆ®¸¸À» ó¸®ÇÒ ¼ö ÀÖ´Â ÀÌ´õ³Ý¿¡¼­´Â ´ç½ÅÀº ±× ÇÑ°è¿¡ µµ´ÞÇÑ °ÍÀÌ´Ù. ¸ðµ©À» ÅëÇؼ­´Â ´õ ÀÛÀº 576 MTU(´Ù½ÃÇѹø, Çì´õÆ÷ÇÔ)°¡ ÇÑ°èÀÌ´Ù.

    ¹«¾ùº¸´Ù ´ç½ÅÀº ¸ðµç µ¥ÀÌŸ°¡ º¸³»Á³´ÂÁö È®ÀÎÇØ¾ß ÇÑ´Ù.(ÀÚ¼¼ÇÑ ¼³¸íÀº sendall()ÇÔ¼ö ±¸ÇöÀ» º¸¶ó.) ÀÏ´Ü ±×°Í¸¸ È®½ÇÇÏ¸é ¸ðµç µ¥ÀÌŸ°¡ ¹Þ¾ÆÁú¶§±îÁö recv()¸¦ ·çÇÁ³»¿¡¼­ È£ÃâÇÒ ÇÊ¿ä°¡ ÀÖ´Ù.

    ´ÙÁßÀÇ recv()È£ÃâÀ» ÀÌ¿ëÇÑ ¿ÏÀüÇÑ µ¥ÀÌŸ¸¦ ¾ò´Â ÀÚ¼¼ÇÑ ¼³¸íÀº Son of Data Encapsulation ¼½¼ÇÀ» Àо¶ó.

  • Q: ³ª´Â À©µµ¿ì ¹Ú½ºÀ§¿¡ ÀÖ°í fork() ½Ã½ºÅÛ È£ÃâÀ̳ª sigaction ±¸Á¶Ã¼ Á¾·ù¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ¾î¶»°Ô ÇؾßÇϳª? A:¸¸¾à ±×°ÍµéÀÌ ¾îµò°¡ ÀÖ´Ù¸é ±×°ÍµéÀº POSIX¶óÀ̺귯¸®¾È¿¡ ÀÖÀ»°ÍÀÌ°í ´ç½ÅÀÇ ÄÄÆÄÀÏ·¯¿¡ žÀçµÇ¾úÀ»°ÍÀÌ´Ù. ³ª´Â À©µµ¿ì ¹Ú½º¸¦ °¡Áö°í ÀÖÁö ¾Ê¾Æ¼­ ´äÀ» ÁÙ ¼ö°¡ ¾øÁö¸¸ Microsoft´Â POSIX ȣȯ¼º °èÃþÀ» °¡Áö°í ÀÖ´Ù°í ±â¾ïÇÏ°í ÀÖ°í, °Å±â¿¡ fork()°¡ ÀÖÀ»°Í °°´Ù.(sigactionµµ ¸¶Âù°¡Áö´Ù) VC++¿¡ µ¿ºÀµÈ µµ¿ò¸»¿¡ "fork"³ª "POSIX"¸¦ ã¾Æº¸¸é ¾î¶² ´Ü¼­°¡ ÀÖÀ»°ÍÀÌ´Ù.

    ¸¸¾à ±×°ÍÀÌ ¼Ò¿ë¾ø´Ù¸é, fork()/sigaction°°Àº °ÍµéÀ» ã¾Æ³»¼­ Win32ÀÇ CreateProcess()¿¡ ÇØ´çÇÏ´Â °Íµé·Î ´ëüÇ϶ó. ³ª´Â CreateProcess()¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¸ð¸¥´Ù. ±×°ÍÀº ¼ö¸¹Àº ¸Å°³º¯¼ö¸¦ °¡Áø´Ù, ÇÏÁö¸¸ ±×°ÍÀº VC++¿¡ Æ÷ÇÔµÈ ¹®¼­µéÀÌ ´Ù·ç°í ÀÖÀ»°ÍÀÌ´Ù.

  • Q: ¾Ïȣȭ¸¦ Çؼ­ ¾ÈÀüÇÏ°Ô TCP/IP·Î µ¥ÀÌŸ¸¦ º¸³»´Â ¹æ¹ýÀº? A:OpenSSL ÇÁ·ÎÁ§Æ®¸¦ Âü°íÇ϶ó.

  • Q:³ª´Â ¹æÈ­º® µÚ¿¡ ÀÖ´Ù-- ¹æÈ­º® ¿ÜºÎÀÇ »ç¶÷ÀÌ ³» IPÁÖ¼Ò¸¦ ¾Ë¾Æ³»¼­ ³» ÄÄÇ»ÅÍ¿¡ Á¢¼ÓÇÏ°Ô ÇÏ´Â ¹æ¹ýÀº? A:ºÒÇàÇÏ°Ôµµ, ¹æÈ­º®ÀÇ ¸ñÀûÀº ¹æÈ­º® ¿ÜºÎÀÇ »ç¶÷µéÀÌ ¹æÈ­º® ³»ºÎÀÇ ÄÄÇ»ÅÍ¿¡ Á¢¼ÓÇϴ°ÍÀ» ¸·´Â °ÍÀÌ´Ù. ±×·¯¹Ç·Î ¿ÜºÎ¿¡¼­ Á¢¼ÓÇÏ°Ô Çϴ°ÍÀº ±âº»ÀûÀ¸·Î º¸¾ÈÀ» ħÇØÇϴ°ÍÀ¸·Î ¿©°ÜÁø´Ù.

    ÀÌ°ÍÀº ¸ðµç°ÍÀÌ ¸·ÇôÀÖ´Ù°í Çϴ°ÍÀº ¾Æ´Ï´Ù. ¿¹¸¦ µéÀÚ¸é, ´ç½ÅÀº ¿©ÀüÈ÷ ¶§¶§·Î ±×°ÍÀÌ masquerading³ª NATµîµîÀÇ ¾î¶² ÀÏÀ» ÇÒ¶§ ¹æÈ­º®À» ÅëÇØ connect()ÇÒ ¼ö ÀÖ´Ù. ´ÜÁö ´ç½ÅÀÇ ÇÁ·Î±×·¥ÀÇ ¿¬°áÀ» ÃʱâÈ­ ÇÏ´Â À¯ÀÏÇÑ »ç¶÷À̱⸸ ÇÏ¸é ´ç½ÅÀº ±¦ÂúÀ» °ÍÀÌ´Ù.

    ¸¸¾à ±×°ÍÀÌ ºÒ¸¸Á·½º·´´Ù¸é, ´ç½ÅÀº ´ç½ÅÀÇ ½Ã½ºÅÛ °ü¸®ÀÚ¿¡°Ô »ç¶÷µéÀÌ ´ç½Å¿¡°Ô Á¢¼ÓÇÒ ¼ö ÀÖ°Ô ¹æÈ­º®¿¡ ±¸¸ÛÀ» Çϳª ¸¸µé¾î ´Þ¶ó°í ¿äûÇÒ ¼öµµ ÀÖ´Ù. ¹æÈ­º®Àº ±×°ÍÀÇ NAT¼ÒÇÁÆ®¿þ¾î³ª ÇÁ·Ï½Ã°°Àº °ÍµéÀ» ÅëÇؼ­ ´ç½Å¿¡°Ô Æ÷¿öµù ÇØ ÁÙ ¼ö ÀÖÀ»°ÍÀÌ´Ù.

    ¹æÈ­º®ÀÇ ±¸¸ÛÀ» °¡º±°Ô »ý°¢Çؼ­´Â ¾ÈµÈ´Ù. ´ç½ÅÀº ³ª»Û»ç¶÷µéÀÌ ³»ºÎ ³×Æ®¿÷¿¡ Á¢¼ÓÇÒ ¼ö ¾ø°Ô ÇؾßÇÑ´Ù. ¸¸¾à Ãʺ¸ÀÚ¶ó¸é, ¼ÒÇÁÆ®¿þ¾î°¡ º¸¾È¼ºÀ» °¡Áö°Ô ¸¸µå´Â °ÍÀº ´ç½ÅÀÌ »ó»óÇÏ´Â °Íº¸´Ù ¾î·Æ´Ù.

    ´ç½ÅÀÇ ½Ã½ºÅÛ °ü¸®ÀÚ°¡ ³ª¿¡°Ô È­³ªÁö ¾Êµµ·Ï Ç϶ó.;-)




9. ÁÖÀÇ»çÇ× ¹× ¿¬¶ôó

ÀÌ»óÀÌ ÀüºÎÀÌ¸ç ¹®¼­ »ó¿¡¼­ Å©°Ô Ʋ¸° °÷ÀÌ ¾ø±â¸¸À» ¹Ù¶ö »ÓÀÌ´Ù. ÇÏÁö¸¸ ½Ç¼ö´Â Ç×»ó ÀÖ´Â ¹ýÀÌ´Ù.

¸¸¾à ½Ç¼ö°¡ ÀÖ´Ù¸é ºÎÁ¤È®ÇÑ Á¤º¸¸¦ ÁÖ¾î Çò°¥¸®°Ô ¸¸µí °Í¿¡ ´ëÇÏ¿© »ç°úÇÏÁö¸¸ »ç½Ç»ó ³ªÇÑÅ× Ã¥ÀÓÀ» ¹°À»¼ö´Â ¾ø´Ù. ÀÌ ¾ê±â´Â ¹ýÀûÀÎ °æ°íÀÌ¸ç »ç½Ç»ó ÀÌ ¸ðµç ±ÛµéÀÌ ¸ù¶¥ °ÅÁþ¸»ÀÏ ¼öµµ ÀÖ´Â °ÍÀÌ´Ù.

±×·¡µµ ¼³¸¶ ±×·¸Áö´Â ¾ÊÀ» °ÍÀÌ´Ù. »ç½Ç ³­ ÀÌ ¸ðµç °Íµé ¶§¹®¿¡ »ó´çÈ÷ ¸¹Àº ½Ã°£À» ¼Ò¸ðÇß°í À©µµ¿ì¿ë TCP/IP³×Æ®¿öÅ© À¯Æ¿¸®Æ¼(¿¹¸¦ µé¾î ÅÚ³Ý µî)À» ¹æÇм÷Á¦·Î Çß¾ú´Ù. ³­ ¼ÒÄÏÀÇ ½ÅÀÌ ¾Æ´Ï¶ó ±×³É º¸Åë »ç¶÷ÀÏ »ÓÀÌ´Ù.

±×°Ç ±×·¸°í »ý»êÀûÀÎ (ȤÀº Æı«ÀûÀ̶óµµ) ºñÆòÀÌ ÀÖ´Â ºÐÀº beej@ecst.csuchico.edu ¾ÕÀ¸·Î ¸ÞÀÏÀ» Áֱ⠹ٶõ´Ù. Âü°íÇÏ¿© °íÃijª°¡µµ·Ï ³ë·ÂÀ» ÇØ º¸°Ú´Ù.

¿Ö ÀÌ ÀÏÀ» Çߴ°¡ ±Ã±ÝÇÏ´Ù¸é, µ·¹ú·Á°í Çß´Ù. ÇÏÇÏ~ »ç½ÇÀº ¾Æ´Ï°í ¸¹Àº »ç¶÷µéÀÌ ¼ÒÄÏ¿¡ °ü·ÃµÈ Áú¹®À» ÇØ´ë´Â ¹Ù¶÷¿¡ ±×µé¿¡°Ô ÀÌ ³»¿ëÀ» À¥¿¡ ¿Ã¸®·Á°í »ý°¢ ÁßÀ̶ó°í ¸»Çß´õ´Ï "¹Ù·Î ±×°Å¾ß~"¶ó°íµé Çؼ­ ½è´Ù. ¾Æ¹«¸® °í»ýÇؼ­ ¾òÀº Á¤º¸¶óµµ ¸¸ÀÏ ´Ù¸¥ »ç¶÷°ú °øÀ¯ÇÏÁö ¾Ê´Â´Ù¸é ¾²·¹±âÀÏ »ÓÀ̶ó°í »ý°¢ÇÑ´Ù. WWW´Â ¹Ù·Î Àû´çÇÑ ¼ö´ÜÀÌ µÈ °Í »ÓÀÌ´Ù. ´Ù¸¥ »ç¶÷µµ ÀÌ·± Á¤º¸ÀÇ Á¦°øÀÌ °¡´ÉÇÏ´Ù¸é ÀÌ·¸°Ô ÇØÁÖ±æ ¹Ù¶õ´Ù.

³¡³µ´Ù. ÇÁ·Î±×·¥À̳ª Â¥·¯°¡ÀÚ. ;-)

¹ø¿ªÇÑ »ç¶÷ÀÇ ¸»: ¿ì¿¬È÷ ÀÌ ±ÛÀ» ¹ß°ßÇÏ°Ô µÇ¾î ¹ø¿ªÀ» ÇÏ°í º¸´Ï ³ª¸§´ë·Î °¡Ä¡°¡ ÀÖ¾î º¸¿©¼­ ȨÆäÀÌÁö¿¡ ¿Ã·Á ³õ¾Ò½À´Ï´Ù. ¹ø¿ª»óÀÇ ½Ç¼ö°¡ ÀÖ¾ú´Ù¸é »ç°úµå¸®¸ç ÁöÀûÇØ ÁÖ½Å´Ù¸é °íÃÄ ³ª°¡°Ú½À´Ï´Ù. ÁÁÀº ÇÁ·Î±×·¥À» ¸¸µå´Â µ¥¿¡ ÀÌ ±ÛÀÌ ÀÛÀ¸³ª¸¶ µµ¿òÀÌ µÇ±æ ¹Ù¶ø´Ï´Ù.



Copyright © 1995, 1996 by Brian "Beej" Hall. This guide may be reprinted in any medium provided that its content is not altered, it is presented in its entirety, and this copyright notice remains intact. Contact beej@ecst.csuchico.edu for more information. ÁÁÀº ³»¿ëÀÇ ±ÛÀ»ÀÛ¼ºÇÏ°í ÇѱÛÆÇ ¹ø¿ªÀ» Çã¶ôÇØÁØ ¿øÀÛÀÚ¿¡°Ô °¨»çÇÏ¸ç ¹ø¿ªÀڷμ­ÀÇ ¸ðµç ±Ç¸®´Â ÀоîÁֽŠºÐµé²² µå¸®°Ú½À´Ï´Ù. ¹ø¿ª»óÀÇ ½Ç¼ö³ª »ý»êÀûÀÎ ÁöÀûÀº tempter@fourthline.com À¸·Î º¸³»ÁÖ½Ã¸é µÇ°Ú½À´Ï´Ù. °¨»çÇÕ´Ï´Ù.

ID
Password
Join
Many changes of mind and mood; do not hesitate too long.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2013-02-26 21:03:59
Processing time 0.0389 sec