FrontPage|FindPage|TitleIndex|RecentChanges|RSS Network Programming
 
Network Programming ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö, ½±°Ô ÀÌÇØÇϱâ

1 How to ?
1.1 Á¢¼Ó¹Þ±â
1.2 Á¢¼ÓÇϱâ
1.3 ¼ö½Å & ¼Û½Å
1.4 ŸÀ̹Ö
2 ÀüüÀûÀÎ È帧
2.1 Server
2.2 Client
3 À̺¥Æ® °¨Áö
3.1 select ¹æ½Ä
3.2 epoll ¹æ½Ä
4 ¿¡·¯Ã³¸®
4.1 read¿¡¼­ÀÇ ¿¡·¯Ã³¸®
4.2 write¿¡¼­ÀÇ ¿¡·¯Ã³¸®
5 ¼ÒÄÏÇÁ·Î±×·¡¹Ö À̰͸¸Àº ¸í½ÉÇÏÀÚ : Æ÷ÀÎÆ®

¼ÒÄÏ, ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö, ¼­¹ö ÇÁ·Î±×·¡¹ÖÀ̶ó ÇÏ¸é °í¼öÁØÀÇ ÇÁ·Î±×·¡¹Ö ½Ç·ÂÀ» ÇÊ¿ä·Î ÇÏ´Â ¾î·Á¿î ÀÛ¾÷À̶ó´Â »ý°¢µéÀ» ¸ÕÀú ¶°¿Ã¸°´Ù. ÇÏÁö¸¸, °¡¸¸È÷ °¡¸¸È÷ »ý°¢À» Çغ¸¸é »ç½Ç º°°Íµµ ¾ø´Ù. ÇÔ¼ö ¸î°³¿Í ±¸Á¶Ã¼ ¸î°³¸¦ ¾Ë¸é µÇ°í, ¾à°£ º¹ÀâÇÑ ¿¡·¯Ã³¸® °úÁ¤À» ÀÌÇØÇÏ°í ±¸ÇöÇÏ¸é µÈ´Ù.

ÀÌ ±ÛÀº Unix/Linux Ãʺ¸ ¼­¹ö ÇÁ·Î±×·¡¸Ó¸¦ À§ÇÑ ÀÔ¹®À¸·Î, °¡Àå Áß¿äÇÑ °³³ä Áß½ÉÀ¸·Î ¼³¸íÇÏ°íÀÚ ÇÑ´Ù.

1 How to ? #


1.1 Á¢¼Ó¹Þ±â #

Á¢¼ÓÀº listen() -> accept() ·Î ¹Þ´Â´Ù. acceptÀÇ °á°ú·Î Á¤¼ö°ª Çϳª°¡ »ý¼ºµÇ´Âµ¥ ¾ÕÀ¸·Î ¼ö½Å, ¼Û½Å ȤÀº Á¢¼Ó Á¾·á¿¡ ÀÌ Á¤¼ö°ªÀÌ »ç¿ëµÈ´Ù. ÀϹÝÀûÀ¸·Î fd¶ó°í Ç¥ÇöÇÑ´Ù.

1.2 Á¢¼ÓÇϱâ #

connect()·Î Á¢¼ÓÇÑ´Ù. connectÀÇ °á°ú´Â fd Á¤¼ö°ª ÇϳªÀÌ´Ù.

1.3 ¼ö½Å & ¼Û½Å #

¼ö½ÅÀº read·Î ¼Û½ÅÀº write·Î ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀ» °¨½Î°í ÀÖ´Â send ³ª recv ÇÔ¼öµéµµ ÀÖÁö¸¸, ±×³É read, write¸¸ ¾Ë¾Æµµ ÃæºÐÇÏ´Ù.

int read(fd, µ¥ÀÌŸ°¡ ÀúÀåµÉ °÷, ÀÐÀ» ¹ÙÀÌÆ®);
int write(fd, ¾µ µ¥ÀÌŸ, ¾µ ¹ÙÀÌÆ®);

1.4 ŸÀÌ¹Ö #

¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡¼­ °¡Àå °ü½ÉÀ» µÎ¾î¾ß ÇÏ´Â ºÎºÐÀº ŸÀ̹ÖÀÌ´Ù. ¾î¶² ŸÀֿ̹¡¼­ ¾î¶² ÀϵéÀ» ÇØ ÁÙ°ÍÀΰ¡°¡ Áß¿äÇÏ´Ù.

  1. Á¢¼Ó¹Þ±â : listen ÇÏ°í Àִµ¥ ´©±º°¡°¡ Á¢¼ÓÇϸé listen_fd ¿¡ ½ÅÈ£°¡ ¹ß»ýÇÑ´Ù. => accept ¸¦ È£ÃâÇؼ­ Á¢¼Ó¹Þ´Â´Ù.
  2. Á¢¼Ó²÷±â : read, write¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇϸé Á¢¼ÓÀ» ²÷´Â´Ù. ȤÀº ¾Æ¹«¶§³ª ³»°¡ ¸ÕÀú ²÷À»¼öµµ ÀÖ´Ù. => close¸¦ È£ÃâÇÑ´Ù.
  3. ¼ö½Å : fd¿¡ Àб⠽ÅÈ£°¡ ¹ß»ýÇÑ´Ù. = ÀÐÀ» µ¥ÀÌŸ°¡ ÀÖ´Ù´Â ¶æÀÌ´Ù. => read¸¦ È£ÃâÇؼ­ Àд´Ù.
  4. ¼Û½Å : fd¿¡ ¾²±â ½ÅÈ£°¡ ¹ß»ýÇÑ´Ù. = ¼Û½ÅÀ» Çصµ ÁÁ´Ù´Â ¶æÀÌ´Ù. => write¸¦ È£ÃâÇؼ­ ¾´´Ù.

2 ÀüüÀûÀÎ È帧 #


2.1 Server #

    Initialize(); // Àü¹ÝÀûÀÎ ÃʱâÈ­

    Listen(); // ¸®½¼ ½ÃÀÛ

    while(1){ // ¸ÞÀηçÇÁ

         event = CheckEvents(); // À̺¥Æ® °Ë»ç

         if(event°¡ »õ ¿¬°áÀ̸é) CreateNewConnection();
         if(event°¡ READ¸é)      OnRead();
         if(event°¡ WRITEÀ̸é)   OnWrite();
         if(event°¡ ERROR¸é)     OnError();
    } 

2.2 Client #

    Initialize(); // Àü¹ÝÀûÀÎ ÃʱâÈ­

    Connect(); // ¿¬°á ½ÃÀÛ

    while(1){ // ¸ÞÀηçÇÁ

         event = CheckEvents(); // À̺¥Æ® °Ë»ç

         if(event°¡ READ¸é)      OnRead();
         if(event°¡ WRITEÀ̸é)   OnWrite();
         if(event°¡ ERROR¸é)     OnError();
    } 


3 À̺¥Æ® °¨Áö #

À̺¥Æ® °¨Áö¸¦ ¾î¶»°Ô ÇÒ °ÍÀΰ¡? ÀÌ ¹æ¹ýµéÀÌ ÈçÈ÷ ¸»ÇÏ´Â ¼ÒÄÏ ¸ðµ¨ ÀÌ´Ù. ¿©·¯°¡Áö ¹æ¹ýµéÀÌ ÀÖÀ¸³ª °¡Àå Ç¥ÁØÀûÀÎ °ÍÀ¸·Î select¿Í pollÀÌ ÀÖ°í, ¸®´ª½ºÀÇ RTSIG, epoll, ?FreeBSDÀÇ kqueue µîÀÌ ÀÖ´Ù.

3.1 select ¹æ½Ä #

°ü½ÉÀÖ´Â fdµéÀ» set¿¡ µî·ÏÇصΰí(FD_SET) select()ÇÔ¼ö¸¦ È£ÃâÇؼ­ Á¶»ç¸¦ ÇÏ´Â ¹æ½ÄÀÌ´Ù. IS_SET(fd) ¸¦ ÅëÇؼ­, ³»°¡ °ü½ÉÀÖ´Â fd¿¡ »ç°ÇÀÌ »ý°å´ÂÁö ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ÀüÇüÀûÀÎ IO Multiplexing ±â¹ýÀÌ´Ù.


3.2 epoll ¹æ½Ä #

°ü½ÉÀÖ´Â fdµéÀ» set¿¡ µî·ÏÇصΰí(epoll_ctl(ADD)) epoll_wait()¸¦ È£ÃâÇؼ­ Á¶»çÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀÌ °á°ú´Â epoll_event [] ÇüÅ·Πµ¹·ÁÁö¸ç, ÀÌ ¹è¿­Àº »ç°ÇÀÌ »ý±ä fdµéÀÇ ÁýÇÕ´Ï´Ù.


4 ¿¡·¯Ã³¸® #


4.1 read¿¡¼­ÀÇ ¿¡·¯Ã³¸® #

read()ÇÔ¼öÀÇ °á°ú°ªÀÌ 0 ÀÎ °æ¿ì´Â EOF, Áï ¿¬°áÀÌ »ó´ë¹æ¿¡ ÀÇÇØ Á¾·áµÈ °ÍÀÌ´Ù. °á°ú°ªÀÌ -1ÀÎ °æ¿ì´Â ¹«¾ð°¡ ¿¡·¯°¡ ¹ß»ýÇÑ °ÍÀε¥ errno ¶ó´Â »ó¼ö°ªÀ» ÅëÇØ ±× ÀÌÀ¯¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ¾î·°Å³ª read ÇÔ¼ö °á°ú°ªÀÌ -1 ÀÎ °æ¿ì´Â ¿¬°áÁ¾·á 󸮸¦ ÇØÁØ´Ù.
    int nread = read(...);

    if(nread < 1){
        Error();
    }

4.2 write¿¡¼­ÀÇ ¿¡·¯Ã³¸® #

write()ÇÔ¼öÀÇ °á°ú°ªÀÌ 1 º¸´Ù ÀÛÀº °æ¿ì´Â ¸¶Âù°¡Áö·Î ¹«¾ð°¡ ¿¡·¯°¡ ¹ß»ýÇÑ°ÍÀÌ´Ù. ¾î·°Å³ª ¿¬°áÁ¾·á 󸮸¦ ÇØÁØ´Ù. ÇÏÁö¸¸ writeÀÇ ¿¡·¯Ã³¸®¸¦ Ưº°ÇÏ°Ô ÇÏ´Â °ñÄ¡¾ÆÇÂ°Ô ÇÑ°¡Áö ÀÖ´Ù. º¸³»°íÀÚ ÇÏ´Â µ¥ÀÌÅÍ¿Í ½ÇÁ¦·Î º¸³½ µ¥ÀÌÅÍÀÇ »çÀÌÁî°¡ °°Áö ¾ÊÀº °æ¿ì´Ù. ÀÌ »óŸ¦ WOULDBLOCK À̶ó°í ÇÑ´Ù.

WOULDBLOCKÀº, ¿î¿µÃ¼Á¦ ³»ºÎ¹öÆÛ°¡ ²Ë Âù »óÅÂÀ̹ǷΠwrite¸¦ ¼º°øÀûÀ¸·Î ÇÏÁö ¸øÇß´Ù´Â ÀǹÌÀε¥ Åë½Å»óÅ¿¡ ¿¡·¯°¡ ¹ß»ýÇÑ °ÍÀº °áÄÚ ¾Æ´Ï´Ù. µû¶ó¼­, ¿¡·¯·Î °£ÁÖÇÏ°í ¿¬°áÀ» ²÷¾î¼­´Â ¾ÈµÈ´Ù. º¸³»Áö ¸øÇÑ µ¥ÀÌÅÍ´Â ´ÙÀ½¿¡ ´Ù½Ã º¸³»¾ß ÇÑ´Ù.

    int nwrite = write(..., º¸³»°í½ÍÀº ¾ç);

    if(nwrite < 1){
         Error();
    } else if (nwrite < º¸³»°í½ÍÀº ¾ç){
         WouldBlock();
    }

WOULDBLOCKÀÌ ¹ß»ýÇÏÁö ¾Ê°Ô ÇÏ·Á¸é,

  1. ¿î¿µÃ¼Á¦ ¹öÆÛ¸¦ ÃæºÐÈ÷ Å©°Ô Àâ´Â´Ù(setsockoptÇÔ¼ö¸¦ ¾´´Ù). ÀϽÃÀûÀÎ ·¢ ¶§¹®¿¡ ¹ß»ýÇÏ´Â WOULDBLOCKÀº »ó´çÈ÷ ¹æÁöµÈ´Ù.
  2. ¸¹ÀÌ º¸³»Áö ¾Ê´Â´Ù. Ŭ¶óÀ̾ðÆ®°¡ ÃæºÐÈ÷ ¼ö½ÅÇÏ°íµµ ³²À» Á¤µµ·Î Àû°Ô º¸³½´Ù. ´ç½ÅÀÇ ½Ã½ºÅÛ¿¡¼­ Å×½ºÆ®¸¦ ÇØ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. 1ÃÊ´ç Àü¼Û·®À» Á¡Â÷ ´Ã·Á°¡¸é¼­ WOULDBLOCKÀÌ ¹ß»ýÇÏ´Â ½ÃÁ¡À» ¾Ë¾Æ³½ ÈÄ, ½ÇÁ¦ ¼­¹öÇÁ·Î±×·¡¹Ö½Ã¿¡´Â À̰ͺ¸´Ù Àû°Ô º¸³»µµ·Ï ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù.
  3. peer Áï, ¹Ý´ëÆí¿¡¼­ÀÇ ¼ö½Å¹æ½ÄÀ» °³¼±ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¼­¹öÀÌ°Ç Å¬¶óÀ̾ðÆ®ÀÌ°Ç ³×Æ®¿öÅ© ÇÁ·Î±×·¥µéÀº Read À̺¥Æ® Áï½Ã ¿î¿µÃ¼Á¦·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ²¨³»Á༭ ÃÖ´ëÇÑ ¹öÆÛ¸¦ ºñ¿öÁÖµµ·Ï ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù.

5 ¼ÒÄÏÇÁ·Î±×·¡¹Ö À̰͸¸Àº ¸í½ÉÇÏÀÚ : Æ÷ÀÎÆ® #


  1. µ¥ÀÌÅÍ°¡ µé¾î¿À¸é Áï½Ã Àд´Ù. ÀÐÀº µ¥ÀÌÅÍ Ã³¸®´Â ´ÙÀ½À¸·Î ¹Ì·ç¾îµµ ÁÁ´Ù¸¸ READ À̺¥Æ®°¡ ¹ß»ýÇϸé Áï½Ã ÀоîÁà¾ß ÇÑ´Ù.
    • Read À̺¥Æ® Çڵ鷯¿¡¼­, ¸Þ¼¼Áö ºÐ¼®&ÀÀ´ä 󸮸¦ ÇÏ´Â ÇÁ·Î±×·¡¹Ö ¹æ½ÄÀº Áý¾îÄ¡¿ö¾ß ÇÑ´Ù.
    • Àд ºÎºÐ, µ¥ÀÌÅÍ Ã³¸® ºÎºÐÀº ³ª´²¼­ ¼öÇàÇÑ´Ù.
  2. WOULDBLOCK¿¡ ´ëºñÇÑ´Ù. ¿î¿µÃ¼Á¦ ¼ÒÄϹöÆÛ¸¦ Àû´çÈ÷ Å©°ÔÀâ¾ÆÁÖ°í Àû´çÈ÷ º¸³½´Ù. ±×¸®°íµµ ¹ß»ýÇÏ´Â WOULDBLOCKÀº ÇÁ·Î±×·¥ ÀÚü ¹öÆÛ¸µÀ» ÅëÇØ Ã³¸®ÇÏ´Â °ÍÀÌ Á¤¼®ÀûÀÎ ±â¹ýÀÌ´Ù.
  3. read, write´Â ¹°·ÐÀÌ°í, accept, connectµîÀÇ ÇÔ¼ö¿¡ ´ëÇÑ ¿¡·¯Ã³¸®´Â ¸íÈ®È÷ ÇÑ´Ù.
    • ¼­¹ö ÇÁ·Î±×·¥Àº ¿¡·¯°¡ ¹ß»ýÇصµ °è¼Ó µ¹¾Æ¾ß ÇÑ´Ù. ÇϳªÀÇ Ä¿³Ø¼Ç¿¡ ¹ß»ýÇÑ º¹±¸ºÒ°¡´ÉÇÑ ¿¡·¯´Â ±× Ä¿³Ø¼Ç¸¸ ²÷¾î³»´Â °ÍÀ¸·Î ´ëÀÀÇÑ´Ù.

last modified 2004-07-01 10:57:17
EditText|FindPage|DeletePage|LikePages|