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.1 Á¢¼Ó¹Þ±â #
Á¢¼ÓÀº listen() -> accept() ·Î ¹Þ´Â´Ù. acceptÀÇ °á°ú·Î Á¤¼ö°ª Çϳª°¡ »ý¼ºµÇ´Âµ¥ ¾ÕÀ¸·Î ¼ö½Å, ¼Û½Å ȤÀº Á¢¼Ó Á¾·á¿¡ ÀÌ Á¤¼ö°ªÀÌ »ç¿ëµÈ´Ù. ÀϹÝÀûÀ¸·Î fd¶ó°í Ç¥ÇöÇÑ´Ù.
1.2 Á¢¼ÓÇϱâ #
connect()·Î Á¢¼ÓÇÑ´Ù. connectÀÇ °á°ú´Â fd Á¤¼ö°ª ÇϳªÀÌ´Ù.
1.3 ¼ö½Å & ¼Û½Å #
¼ö½ÅÀº read·Î ¼Û½ÅÀº write·Î ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀ» °¨½Î°í ÀÖ´Â send ³ª recv ÇÔ¼öµéµµ ÀÖÁö¸¸, ±×³É read, write¸¸ ¾Ë¾Æµµ ÃæºÐÇÏ´Ù.
int read(fd, µ¥ÀÌŸ°¡ ÀúÀåµÉ °÷, ÀÐÀ» ¹ÙÀÌÆ®);
int write(fd, ¾µ µ¥ÀÌŸ, ¾µ ¹ÙÀÌÆ®);
¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡¼ °¡Àå °ü½ÉÀ» µÎ¾î¾ß ÇÏ´Â ºÎºÐÀº
ŸÀ̹ÖÀÌ´Ù. ¾î¶² ŸÀֿ̹¡¼ ¾î¶² ÀϵéÀ» ÇØ ÁÙ°ÍÀΰ¡°¡ Áß¿äÇÏ´Ù.
- Á¢¼Ó¹Þ±â : listen ÇÏ°í Àִµ¥ ´©±º°¡°¡ Á¢¼ÓÇϸé listen_fd ¿¡ ½ÅÈ£°¡ ¹ß»ýÇÑ´Ù. => accept ¸¦ È£ÃâÇؼ Á¢¼Ó¹Þ´Â´Ù.
- Á¢¼Ó²÷±â : read, write¿¡¼ ¿¡·¯°¡ ¹ß»ýÇϸé Á¢¼ÓÀ» ²÷´Â´Ù. ȤÀº ¾Æ¹«¶§³ª ³»°¡ ¸ÕÀú ²÷À»¼öµµ ÀÖ´Ù. => close¸¦ È£ÃâÇÑ´Ù.
- ¼ö½Å : fd¿¡ Àб⠽ÅÈ£°¡ ¹ß»ýÇÑ´Ù. = ÀÐÀ» µ¥ÀÌŸ°¡ ÀÖ´Ù´Â ¶æÀÌ´Ù. => read¸¦ È£ÃâÇؼ Àд´Ù.
- ¼Û½Å : fd¿¡ ¾²±â ½ÅÈ£°¡ ¹ß»ýÇÑ´Ù. = ¼Û½ÅÀ» Çصµ ÁÁ´Ù´Â ¶æÀÌ´Ù. => write¸¦ È£ÃâÇؼ ¾´´Ù.
2 ÀüüÀûÀÎ È帧 #
Initialize(); // Àü¹ÝÀûÀÎ ÃʱâÈ
Listen(); // ¸®½¼ ½ÃÀÛ
while(1){ // ¸ÞÀηçÇÁ
event = CheckEvents(); // À̺¥Æ® °Ë»ç
if(event°¡ »õ ¿¬°áÀ̸é) CreateNewConnection();
if(event°¡ READ¸é) OnRead();
if(event°¡ WRITEÀ̸é) OnWrite();
if(event°¡ ERROR¸é) OnError();
}
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.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ÀÌ ¹ß»ýÇÏÁö ¾Ê°Ô ÇÏ·Á¸é,
- ¿î¿µÃ¼Á¦ ¹öÆÛ¸¦ ÃæºÐÈ÷ Å©°Ô Àâ´Â´Ù(setsockoptÇÔ¼ö¸¦ ¾´´Ù). ÀϽÃÀûÀÎ ·¢ ¶§¹®¿¡ ¹ß»ýÇÏ´Â WOULDBLOCKÀº »ó´çÈ÷ ¹æÁöµÈ´Ù.
- ¸¹ÀÌ º¸³»Áö ¾Ê´Â´Ù. Ŭ¶óÀ̾ðÆ®°¡ ÃæºÐÈ÷ ¼ö½ÅÇÏ°íµµ ³²À» Á¤µµ·Î Àû°Ô º¸³½´Ù. ´ç½ÅÀÇ ½Ã½ºÅÛ¿¡¼ Å×½ºÆ®¸¦ ÇØ º¼ ÇÊ¿ä°¡ ÀÖ´Ù. 1ÃÊ´ç Àü¼Û·®À» Á¡Â÷ ´Ã·Á°¡¸é¼ WOULDBLOCKÀÌ ¹ß»ýÇÏ´Â ½ÃÁ¡À» ¾Ë¾Æ³½ ÈÄ, ½ÇÁ¦ ¼¹öÇÁ·Î±×·¡¹Ö½Ã¿¡´Â À̰ͺ¸´Ù Àû°Ô º¸³»µµ·Ï ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù.
- peer Áï, ¹Ý´ëÆí¿¡¼ÀÇ ¼ö½Å¹æ½ÄÀ» °³¼±ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¼¹öÀÌ°Ç Å¬¶óÀ̾ðÆ®ÀÌ°Ç ³×Æ®¿öÅ© ÇÁ·Î±×·¥µéÀº Read À̺¥Æ® Áï½Ã ¿î¿µÃ¼Á¦·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ²¨³»Á༠ÃÖ´ëÇÑ ¹öÆÛ¸¦ ºñ¿öÁÖµµ·Ï ÀÛ¼ºµÇ¾î¾ß ÇÑ´Ù.
5 ¼ÒÄÏÇÁ·Î±×·¡¹Ö À̰͸¸Àº ¸í½ÉÇÏÀÚ : Æ÷ÀÎÆ® #
- µ¥ÀÌÅÍ°¡ µé¾î¿À¸é Áï½Ã Àд´Ù. ÀÐÀº µ¥ÀÌÅÍ Ã³¸®´Â ´ÙÀ½À¸·Î ¹Ì·ç¾îµµ ÁÁ´Ù¸¸ READ À̺¥Æ®°¡ ¹ß»ýÇϸé Áï½Ã ÀоîÁà¾ß ÇÑ´Ù.
- Read À̺¥Æ® Çڵ鷯¿¡¼, ¸Þ¼¼Áö ºÐ¼®&ÀÀ´ä 󸮸¦ ÇÏ´Â ÇÁ·Î±×·¡¹Ö ¹æ½ÄÀº Áý¾îÄ¡¿ö¾ß ÇÑ´Ù.
- Àд ºÎºÐ, µ¥ÀÌÅÍ Ã³¸® ºÎºÐÀº ³ª´²¼ ¼öÇàÇÑ´Ù.
- WOULDBLOCK¿¡ ´ëºñÇÑ´Ù. ¿î¿µÃ¼Á¦ ¼ÒÄϹöÆÛ¸¦ Àû´çÈ÷ Å©°ÔÀâ¾ÆÁÖ°í Àû´çÈ÷ º¸³½´Ù. ±×¸®°íµµ ¹ß»ýÇÏ´Â WOULDBLOCKÀº ÇÁ·Î±×·¥ ÀÚü ¹öÆÛ¸µÀ» ÅëÇØ Ã³¸®ÇÏ´Â °ÍÀÌ Á¤¼®ÀûÀÎ ±â¹ýÀÌ´Ù.
- read, write´Â ¹°·ÐÀÌ°í, accept, connectµîÀÇ ÇÔ¼ö¿¡ ´ëÇÑ ¿¡·¯Ã³¸®´Â ¸íÈ®È÷ ÇÑ´Ù.
- ¼¹ö ÇÁ·Î±×·¥Àº ¿¡·¯°¡ ¹ß»ýÇصµ °è¼Ó µ¹¾Æ¾ß ÇÑ´Ù. ÇϳªÀÇ Ä¿³Ø¼Ç¿¡ ¹ß»ýÇÑ º¹±¸ºÒ°¡´ÉÇÑ ¿¡·¯´Â ±× Ä¿³Ø¼Ç¸¸ ²÷¾î³»´Â °ÍÀ¸·Î ´ëÀÀÇÑ´Ù.