Socket API
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Docbook ¿ø¹®

¼ÒÄϿɼÇ

¿Ï¼ºÀÌ µÇ¸é docbook¿¡ Ãß°¡µÉ °ÍÀÌ´Ù.

³×Æ®¿öÅ© ȯ°æÀº ¸Å¿ì ´Ù¾çÇϸç, ¿¹ÃøÇϱâ Èûµç°æ¿ìµµ ¸¹ÀÌ ¹ß»ýÇÑ´Ù. ¶§¹®¿¡ ³×Æ®¿öÅ©ÇÁ·Î±×·¥ÀÇ Á¾·ù¿¡ µû¶ó¼­ ¼ÒÄÏÀÇ ¼¼ºÎ»çÇ×À» Á¶ÀýÇØ¾ß ÇÏ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ÀÌ·¯ÇÑ ¼ÒÄÏ¿É¼Ç ¼³Á¤À» À§Çؼ­ ¼ÒÄÏÀº getsockopt()¿Í setsockopt()µÎ°³ÀÇ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ getsockopt´Â ÇöÀçÀÇ ¼ÒÄϿɼǰªÀ» °¡Á®¿À±â À§Çؼ­, setsockopt´Â ¼ÒÄϿɼǰªÀ» º¯°æÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù.

¿¹¸¦ µéÀÚ¸é µ¿ÀÏÇÑ ³×Æ®¿ö ÇÁ·Î±×·¥À̶ó°í ÇÏ´õ¶óµµ ATM¸Á¿¡¼­ ÀÛµ¿ÇÏ´Â °Í°ú ÀÎÅͳݸÁ PPP¿¡¼­ ÀÛµ¿ÇÏ´Â °ÍÀº ȯ°æ¿¡ À־ Â÷À̰¡ »ý±æ ¼ö ¹Û¿¡ ¾øÀ» °ÍÀÌ´Ù. ¼ÒÄϹöÆÛÀÇ Å©±â¸¦ ¿¹·Î µéÀÚ¸é, ÀϹÝÀûÀ¸·Î (´ë¿ªÆø * Áö¿¬À²) * 2ÀÇ °ø½Ä¿¡ µû¸¦ °æ¿ì ÃÖÀûÀÇ È¿°ú¸¦ º¸¿©Áشٰí ÇÑ´Ù. ´ÙÀ½Àº À̵é ÇÔ¼öÀÇ »ç¿ë¹æ¹ýÀÌ´Ù.
#include <sys/types.h> 
#include <sys/socket.h> 
 
int  getsockopt(int  s, int level, int optname, void *optval, socklen_t *optlen); 
int setsockopt(int s, int  level,  int  optname,  const  void  *optval, socklen_t optlen); 
 
  • s : ¼ÒÄÏÁöÁ¤¹øÈ£
  • level : ¼ÒÄÏÀÇ ·¹º§·Î ¾î¶² ·¹º§ÀÇ ¼ÒÄÏÁ¤º¸¸¦ °¡Á®¿À°Å³ª º¯°æÇÒ °ÍÀÎÁö¸¦ ¸í½ÃÇϸç, SOL_SOCKET¿Í IPPROTO_TCP Áß Çϳª¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
  • optname : ¼³Á¤À» À§ÇÑ ¼ÒÄϿɼÇÀÇ ¹øÈ£
  • optval : ¼³Á¤°ªÀ» ÀúÀåÇϱâ À§ÇÑ ¹öÆÛÀÇ Æ÷ÀÎÅÍ
  • optlen : optval ¹öÆÛÀÇ Å©±â

¼³Á¤°ªÀ» void * ·Î ³Ñ±â´Â ÀÌÀ¯´Â ¼³Á¤ÇϰíÀÚ ÇÏ´Â ¼ÒÄϿɼǿ¡ µû¶ó¼­, boolean, interger, ±¸Á¶Ã¼µî ´Ù¾çÇÑ Å©±â¸¦ °¡Áö´Â µ¥ÀÌÅÍÇüÀÌ »ç¿ëµÇ±â ¶§¹®ÀÌ´Ù. ¸¸¾à º¯°æÇϰíÀÚ ÇÏ´Â ¼ÒÄϿɼÇÀÌ booleanÀ» µû¸¥´Ù¸é, 0ȤÀº 1ÀÌ »ç¿ëµÉ °ÍÀÌ´Ù.

SOL_SOCKET·¹º§¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¿É¼Ç°ú µ¥ÀÌŸÇüÀº ´ÙÀ½°ú °°´Ù.
¿É¼Ç°ª µ¥ÀÌÅÍÇü ¼³¸í
SO_BROADCAST BOOL ºê·Îµåij½ºÆ® ¸Þ½ÃÁö Àü´ÞÀÌ °¡´ÉÇϵµ·Ï ÇÑ´Ù.
SO_DEBUG BOOL µð¹ö±ë Á¤º¸¸¦ ·¹ÄÚµù ÇÑ´Ù.
SO_DONTLINGER BOOL ¼ÒÄÏÀ» ´ÝÀ»¶§ º¸³»Áö ¾ÊÀº µ¥ÀÌÅ͸¦ º¸³»±â À§Çؼ­ ºí·°µÇÁö ¾Êµµ·Ï ÇÑ´Ù.
SO_DONTROUTE BOOL ¶ó¿ìÆÃ ÇÏÁö ¾Ê°í Á÷Á¢ ÀÎÅÍÆäÀ̽º·Î º¸³½´Ù.
SO_GROUP_PRIORITY int »ç¿ëÇÏÁö ¾ÊÀ½
SO_KEEPALIVE BOOL Keepalives¸¦ Àü´ÞÇÑ´Ù.
SO_LINGER struct LINGER ¼ÒÄÏÀ» ´ÝÀ» ¶§ Àü¼ÛµÇÁö ¾ÊÀº µ¥ÀÌÅÍÀÇ Ã³¸® ±ÔÄ¢
SO_RCVBUF int µ¥ÀÌÅ͸¦ ¼ö½ÅÇϱâ À§ÇÑ ¹öÆÛ°ø°£ÀÇ ¸í½Ã
SO_REUSEADDR BOOL ÀÌ¹Ì »ç¿ëµÈ ÁÖ¼Ò¸¦ Àç»ç¿ë (bind) Çϵµ·Ï ÇÑ´Ù.
SO_SNDBUF int µ¥ÀÌÅÍ Àü¼ÛÀ» À§ÇÑ ¹öÆÛ°ø°£ ¸í½Ã

IPPROTO_TCP·¹º§¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¿É¼Ç°ú µ¥ÀÌÅÍÇüÀÌ´Ù.
TCP_NODELAY BOOL Nagle ¾Ë°í¸®Áò Á¦¾î

SO_REUSEADDR

°£´ÜÇÑ ¿¹·Î, ¼ÒÄÏÀ» ÀÌ¿ëÇÑ ¼­¹öÇÁ·Î±×·¥À» ¿î¿ëÇÏ´Ù º¸¸é °­Á¦Á¾·áµÇ°Å³ª ºñÁ¤»ó Á¾·áµÇ´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. Å×½ºÆ®¸¦ ¸ñÀûÀ¸·Î ÇÒ °æ¿ì¿¡´Â ƯÈ÷ °­Á¦Á¾·á ½ÃÄÑ¾ß ÇÏ´Â °æ¿ì°¡ ÀÚÁÖ ¹ß»ýÇϴµ¥, °­Á¦Á¾·á ½Ã۰í ÇÁ·Î±×·¥À» ´Ù½Ã ½ÇÇà½Ãų°æ¿ì ´ÙÀ½°ú °°Àº ¸Þ½ÃÁö¸¦ Á¾Á¾ º¸°Ô µÈ´Ù.
bind error : Address already in use 
 
ÀÌ´Â ±âÁ¸ ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ¾úÁö¸¸, ºñÁ¤»óÁ¾·áµÈ »óÅ·Π¾ÆÁ÷ Ä¿³ÎÀÌ bind(2)Á¤º¸¸¦ À¯ÁöÇϰí ÀÖÀ½À¸·Î ¹ß»ýÇÏ´Â ¹®Á¦´Ù. º¸Åë 1-2ºÐ Á¤µµ Áö³ª¸¸ Ä¿³ÎÀÌ ¾Ë¾Æ¼­ Á¤¸®¸¦ Çϱä ÇÏÁö¸¸, ±× ½Ã°£µ¿¾È ±â´Þ·Á¾ß ÇÑ´Ù´Â °ÍÀº »ó´çÈ÷ ¹ø°Å·Î¿î ÀÏÀÌ µÉ °ÍÀÌ´Ù. ÀÌ °æ¿ì ´ÙÀ½°ú °°Àº Äڵ带 »ðÀÔÇÔÀ¸·Î½á ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù.
int sock = socket(...); 
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&bf, (int)sizeof(bf)); 
 
ÀÌ·¸°Ô Çϸé Ä¿³ÎÀº ±âÁ¸¿¡ bind·Î ÇÒ´çµÈ ¼ÒÄÏÀÚ¿øÀ» ÇÁ·Î¼¼½º°¡ Àç »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çã¶ôÇÏ°Ô µÈ´Ù.

´ÙÀ½Àº ¼ÒÄϹöÆÛÀÇ Å©±â¸¦ °¡Á®¿À°í ¼³Á¤ÇÏ´Â ¿ÏÀüÇÑ ÄÚµå´Ù.
#include <sys/types.h> #include <sys/stat.h> #include <sys/socket.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { int sockfd; int bufsize; int rn; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Error"); return 1; } rn = sizeof(int); // ÇöÀç RCVBUF °ªÀ» ¾ò¾î¿Â´Ù. if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, (socklen_t *)&rn) < 0) { perror("Set Error"); return 1; } printf("Socket RCV Buf Size is %d\n", bufsize); // ¹öÆÛÀÇ Å©±â¸¦ 100000 À¸·Î ¸¸µç´Ù. bufsize = 100000; if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (void *)&bufsize, (socklen_t)rn) < 0) { perror("Set Error"); return 1; } return 0; }

TCP_NODELAY

ÀÌ ¿É¼ÇÀ» ÀÌÇØÇÏ·Á¸é Nagle¾Ë°í¸®Áò¿¡ ´ëÇØ¼­ ÀÌÇØ¸¦ ÇØ¾ß ÇÑ´Ù. Nagle ¾Ë°í¸®ÁòÀÌ Àû¿ëµÇ¸é, ¿î¿µÃ¼Á¦´Â ÆÐŶÀ» ACK°¡ ¿À±â¸¦ ±â´Ù·È´Ù°¡ µµÂøÇϸé, ±× µ¿¾È ½×¿©ÀÖ´ø µ¥ÀÌÅ͸¦ ÇѲ¨¹ø¿¡ º¸³»°Ô µÈ´Ù. ÀÌ·¯ÇÑ ¹æ½ÄÀ» »ç¿ëÇÏ°Ô µÇ¸é, ´ë¿ªÆøÀÌ ³·Àº WAN¿¡¼­ ºó¹øÇÑ Àü¼ÛÀ» ÁÙÀÌ°Ô µÊÀ¸·Î È¿°úÀûÀÎ ´ë¿ªÆøÈ°¿ëÀÌ °¡´ÉÇØÁø´Ù.

´ëºÎºÐÀÇ °æ¿ì¿¡ À־ Nagle ¾Ë°í¸®ÁòÀº È¿À²ÀûÀ¸·Î ÀÛµ¿Çϱä ÇÏÁö¸¸, ºó¹øÇÑ ÀÀ´äÀÌ Áß¿äÇÑ ¼­ºñ½ºÀÇ °æ¿ì¿¡´Â Àû´çÇÏÁö ¾ÊÀº °æ¿ì°¡ ¹ß»ýÇÑ´Ù. ¿¹¸¦ µé¾î X-TerminalÀ» ÀÌ¿ëÇÒ °æ¿ì ¸¶¿ì½º À̺¥Æ®´Â Áï½Ã Àü´ÞµÉ Çʿ䰡 Àִµ¥, Nagle¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¸é ¾Æ¹«·¡µµ ¹ÝÀÀ½Ã°£ÀÌ ¶³¾îÁö°Ô µÉ °ÍÀÌ´Ù. ½Ç½Ã°£ÀûÀÎ ¹ÝÀÀÀÌ Áß¿äÇÑ ¿Â¶óÀÎ °ÔÀÓ¿ª½Ã Nagle ¾Ë°í¸®ÁòÀ» Á¦°ÅÇÏ´Â°Ô ÁÁÀ» °ÍÀÌ´Ù.

¾Æ·¡ÀÇ À̹ÌÁö´Â nagleÀÌ Àû¿ëµÇ¾úÀ» ¶§¿Í ±×·¸Áö ¾ÊÀ» ¶§, ¾î¶»°Ô µ¥ÀÌÅÍ Àü¼ÛÀÌ ÀϾ´ÂÁö¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.

http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/setsockopt?action=download&value=nagle.png

SO_LINGER

SO_LINGERÀº ¼ÒÄÏÀÌ close()µÇ¾úÀ» ¶§, ¼ÒÄϹöÆÛ¿¡ ³²¾ÆÀÖ´Â µ¥ÀÌÅ͸¦ ¾î¶»°Ô ÇÒ °ÍÀÌÁö¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ´ÙÀ½Àº SO_LINGER ¿É¼Ç¿¡ »ç¿ëµÇ´Â µ¥ÀÌÅͱ¸Á¶Ã¼ÀÌ´Ù.
struct linger 
{ 
    int l_onoff; 
    int l_linger; 
} 
 
  • l_onoff : linger ¿É¼ÇÀ» ²ø°ÍÀÎÁö ų °ÍÀÎÁö °áÁ¤
  • l_linger : ±â´Ù¸®´Â ½Ã°£ÀÇ °áÁ¤

À§ÀÇ µÎ°³ÀÇ ¸â¹öº¯¼öÀÇ °ªÀ» ¾î¶»°Ô ÇÏ´À³Ä¿¡ µû¶ó 3°¡Áö close¹æ½ÄÀ» °áÁ¤µÇ¾î Áø´Ù.
  1. l_onoff == 0 : ÀÌ °æ¿ì l_lingerÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù. ¼ÒÄÏÀÇ ±âº»¼³Á¤À¸·Î ¼ÒÄϹöÆÛ¿¡ ³²¾Æ ÀÖ´Â ¸ðµç µ¥ÀÌÅ͸¦ º¸³½´Ù. À̶§ close()´Â ¹Ù·Î ¸®ÅÏÀ» ÇÏ°Ô µÇ¹Ç·Î ¹é±×¶ó¿îµå¿¡¼­ ÀÌ·¯ÇÑ ÀÏÀÌ ÀϾ°Ô µÈ´Ù. ¿ì¾ÆÇÑ ¿¬°á Á¾·á¸¦ º¸ÀåÇÑ´Ù.
  2. l_onoff > 0 À̰í l_linger == 0 : close()´Â ¹Ù·Î ¸®ÅÏÀ» Çϸç, ¼ÒÄϹöÆÛ¿¡ ¾ÆÁ÷ ³²¾ÆÀÖ´Â µ¥ÀÌÅÍ´Â ¹ö·Á ¹ö¸°´Ù. TCP ¿¬°á»óÅÂÀÏ °æ¿ì¿¡´Â »ó´ëÆí È£½ºÆ®¿¡ ¸®¼ÂÀ» À§ÇÑ RST ÆÐŶÀ» º¸³½´Ù. hard ȤÀº abortive Á¾·á¶ó°í ºÎ¸¥´Ù.
  3. l_onoff > 0 À̰í l_linger > 0 : ¹öÆÛ¿¡ ³²¾ÆÀÖ´Â µ¥ÀÌÅ͸¦ ¸ðµÎ º¸³»´Â ¿ì¾ÆÇÑ ¿¬°á Á¾·á¸¦ ÇàÇÑ´Ù. À̶§ close()¿¡¼­´Â l_linger¿¡ ÁöÁ¤µÈ ½Ã°£¸¸Å­ ºí·°»óÅ¿¡¼­ ´ë±âÇÑ´Ù. ¸¸¾à ÁöÁ¤µÈ ½Ã°£³»¿¡ µ¥ÀÌÅ͸¦ ¸ðµÎ º¸³Â´Ù¸é ¸®ÅÏÀÌ µÇ°í, ½Ã°£ÀÌ ÃʰúµÇ¾ú´Ù¸é ¿¡·¯¿Í ÇÔ²² ¸®ÅÏÀÌ µÈ´Ù.

¼ÒÄÏ timeout

  1. ¼ÒÄÏ Timeout
Socket

Socket

À± »ó¹è

고친 과정
고침 0.92004³â 8¿ù 19ÀÏ
ÀÔÃâ·ÂÇÔ¼ö/µµ¸ÞÀÎ À̸§º¯È¯/¹ÙÀÌÆ®¿À´õ °ü·Ã ÇÔ¼ö Ãß°¡

1. Socket ¿¡ ´ëÇÑ ±âº»Áö½Ä

1.1. Socket Layer

Socket Àº À¯´Ð½ºÀÇ ÆÄÀÏ ±â¼úÀÚ¸¦ ÅëÇØ¼­ ´Ù¸¥ ÇÁ·Î±×·¥°£ÀÇ Á¤º¸±³È¯À» °¡´ÉÇϵµ·Ï ÇØÁÖ´Â ¹æ¹ýÀ¸·Î, °°Àº ½Ã½ºÅÛ¿¡ ÀÖ´Â ÇÁ·Î±×·¥µé°£ÀÇ Á¤º¸±³È¯À» À§ÇѸñÀû, ȤÀº ´Ù¸¥ ½Ã½ºÅÛ(³×Æ®¿÷ »óÀ¸·Î ¸Ö¸®¶³¾îÁ®ÀÖ´Â) µé°£ÀÇ Á¤º¸±³È¯À» À§ÇÑ ¸ñÀûÀ¸·Î »ç¿ëµÈ´Ù.

±×·±µ¥ ¿Ö Layer ¶ó°í ºÎ¸£´Â°¡ ±× ÀÌÀ¯´Â TCP/IP 4°èÃþÀÇ ÀÀ¿ë°èÃþ(applicaton layer)°ú Àü¼Û°èÃþ(transmission layer) Áß°£¿¡ Á¸ÀçÇϱ⠶§¹®ÀÌ´Ù. ¾Æ·¡ÀÇ ±×¸²À» º¸¶ó

그림 1. ¼ÒÄÏ °èÃþ

À§ÀÇ ±×¸²Àº TCP/IP °³¿ä¿¡¼­ ÀÌ¹Ì º»ÀûÀÌ ÀÖ´Â ±×¸²ÀÏ °ÍÀÌ´Ù. ±×¶§ÀÇ ±×¸²°ú ´Þ¶óÁø Á¡ÀÌ ÀÖ´Ù¸é, ÀÀ¿ë°èÃþ°ú Àü¼Û°èÃþ¿¡ Socket Layer °¡ Á¸ÀçÇÑ´Ù´Â °ÍÀÌ´Ù. ÀÌ Socket Layer °¡ ÀÀ¿ë°èÃþ°ú Àü¼Û°èÃþ »çÀÌ¿¡ Á¸ÀçÇÏ°Ô µÊÀ¸·Î ¿ì¸® ÇÁ·Î±×·¡¸ÓµéÀº º¹ÀâÇÏ°Ô TCP ¸¦ Á÷Á¢ Á¦¾îÇÒ ÇÊ¿ä¾øÀÌ, Socket Layer ¿¡¼­ Á¦°øÇÏ´Â ´Ù¾çÇÑ ÇÔ¼ö(Socket API)¸¦ ÀÌ¿ëÇØ¼­ °£´ÜÇÏ°Ô ÀÎÅÍ³Ý ³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ÀÛ¾÷À» ÇÏ°Ô µÇ´Â°ÍÀÌ´Ù.

Socket Layer Àº ÀÀ¿ë°èÃþ¿¡¼­ ¹ÞÀº ¸Þ½ÃÁö¸¦ ÇϺΠSocket API ¸¦ ÀÌ¿ëÇØ¼­ Àü¼Û°èÃþÀ¸·Î º¸³½´Ù. Àü¼Û°èÃþ¿¡´Â 2°¡Áö ´ëÇ¥ÀûÀÎ ÇÁ·ÎÅäÄÝ ÀÌ Àִµ¥ ¹Ù·Î TCP ¿Í UDP ÀÌ´Ù. ±×·³À¸·Î ¿ì¸® ÇÁ·Î±×·¡¸ÓµéÀº TCPÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÒ°ÍÀÎÁö UDP ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÒ°ÍÀÎÁö¸¸ °áÁ¤ÇØÁÖ¸éµÈ´Ù.


1.2. ¿Ö Layer ±¸Á¶¸¦ °¡Áö´Â°¡

ÀÏ»ó »ýȰ¿¡¼­ ¼ÒÄÏ·¹À̾î¿Í ºñ½ÁÇѰÔ, ÀüÈ­±â¶ó°í º¼¼ö ÀÖÀ»°ÍÀÌ´Ù. ¿ì¸®´Â »ó´ëÆí¿¡¼­ ÀüÈ­¸¦ °É±â À§Çؼ­ »ó´ëÆíÀüÈ­ÀÇ Áö¸®Àû À§Ä¡°¡ ¾îµðÀÎÁö, ¾î¶² ÀüÈ­±¹¿¡¼­ °ü¸®ÇÏ´ÂÁö, ¾ð¾î¸¦ ½ÅÈ£·Î º¯È¯ ½Ã۱â À§Çؼ­ ¾î¶°ÇÑ ÀÛ¾÷À» ÇØ¾ßÇÏ´ÂÁö, ¾î¶»°Ô º¸³»¾ß ÇÏ´ÂÁö ÀüÇô ¾ËÇʿ䰡 ¾ø´Ù. ±×³É ¼öÈ­±â µé°í ÀüÈ­ ¹øÈ£¸¸ ´©¸£¸é ±×°É·Î ³¡ÀÌ´Ù. Áï ÀüÈ­±â ¶ó´Â°Ô ÀÖÀ½À¸·Î ±× ³»ºÎ¿¡¼­ ÀϾ´Â ¿©·¯°¡Áö º¹ÀâÇÑ Åë½Å ÇÁ·Î¼¼½º¸¦ ¸ð¸£°íµµ »ó´ëÆí°ú ÀüÈ­ÅëÈ­¸¦ ÇÒ¼ö ÀÖ°Ô µÈ´Ù.

Socket Layer ÀÌ Á¸ÀçÇÔÀ¸·Î½á, ¿ì¸®´Â TCP/UDP Çì´õ¸¦ ¾î¶»°Ô ¸¸µé¾î¾ß ÇÏ´ÂÁö, ±¸Á¶°¡ ¾î¶»°Ô µÇ´ÂÁö, ¾î¶»°Ô Ä¿³Î¿¡ Àü´ÞÇØ¾ß ÇÏ´ÂÁö ½Å°æ¾µÇÊ¿ä ¾øÀÌ ³×Æ®¿÷ ÇÁ·Î±×·¥À» ¸¸µé¼ö ÀÖ°Ô µÈ´Ù.


1.3. Socket

"Socket ÀÌ¶ó´¢ ¿ì¸®´Â À§¿¡¼­ Socket Layer¸¦ ÀÌ¹Ì ´Ù·ç¾ú´Âµ¥¿ä ?" ¶ó°í Àǹ®À» °¡Áú¼öµµ ÀÖÀ»°ÍÀÌ´Ù. Socket Layer °ú Socket ´Â ¾ö¿¬È÷ ´Ù¸£´Ù. Socket Layer ´Â °èÃþÀ» ³ªÅ¸³»´Â °ÍÀÌ´Ù. Áï Socket ¸¦ ´Ù·ç±â À§ÇÑ °èÃþÀÌ´Ù. ÀÌ´Â TCP°¡ Àü¼Û°èÃþÀÌ ¾Æ´Ñ°Í°ú ¸¶Âù°¡ÁöÀÌ´Ù. ¿ì¸®´Â Socket Layer ¿¡¼­ Á¦°øÇÏ´Â ´Ù¾çÇÑ API¸¦ ÅëÇØ¼­ Socket ¸¦ Á¦¾îÇÏ°Ô µÈ´Ù.

±×·³ Socket À̶õ ¹«¾ùÀΰ¡. ¼ÒÄÏÀ̶õ À¯´Ð½º ÆÄÀÏ Áö½ÃÀÚ ¸¦ ÀÌ¿ëÇÏ¿© ´Ù¸¥ ÇÁ·Î±×·¥°ú Á¤º¸±³È¯À» ÇÏ´Â ¹æ¹ý(ȤÀº µµ±¸) ÀÌ´Ù. ÀϹÝÀûÀ¸·Î À¯´Ð½º »ó¿¡¼­ Á¤º¸±³È¯Àº ÆÄÀÏÁö½ÃÀÚ¸¦ ÅëÇÑ´Ù´Â°É ¾Ë°í ÀÖÀ»°ÍÀÌ´Ù. ¸¶Âù°¡Áö·Î Socket ¸¦ ÀÌ¿ëÇÑ Áö¿ª ȤÀº ³×Æ®¿÷À¸·Î ¿¬°áµÈ ÇÁ·Î±×·¥ °£ÀÇ Á¤º¸±³È¯ ¿ª½Ã ÆÄÀÏÁö½ÃÀÚ¸¦ ÅëÇØ¼­ ÀÌ·ç¾îÁø´Ù.

´ÙÁß¿¬°á¼­¹ö ¸¸µé±â(1) ÀÇ zipcode_multi.c ¸¦ ÀÌ¿ëÇØ¼­ ¼ÒÄÏÀÌ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ¸ÕÀúÀÇ À§ÀÇ ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ½Ã۰í ÀÛµ¿À» ½ÃÄѺ¸ÀÚ. ÀÛµ¿À» ½ÃÄ×´Ù¸é ps ·Î zipcode_multi ÇÁ·Î±×·¥ÀÇ pid ¸¦ È®ÀÎÇØº¸°í /proc/pid/fd µð·ºÅ丮·Î À̵¿Çؼ­ ¾î¶°ÇÑ ÆÄÀÏ Áö½ÃÀÚ¸¦ °¡Áö°í ÀÖ´ÂÁö È®ÀÎÇØº¸µµ·Ï ÇÏÀÚ.

[yundream@localhost test]# ./zipcode_multi 4444
...
[yundream@localhost test]# ps -ax | grep zipcode 
 2473 ttyp1    S      0:00 ./zipcode_multi 4444
			
pid°¡ 2473 À̹ǷΠÀÌ ÇÁ·Î±×·¥ÀÇ /proc/2473/fd ·Î À̵¿Çؼ­ lsÇØº¸¸é ÇÁ·Î±×·¥¿¡¼­ »ç¿ëÇϰíÀÖ´Â ÆÄÀÏÁö½ÃÀڵ鿡 ´ëÇØ¼­ ¾Ë¼ö ÀÖ´Ù.
[yundream@localhost test]# ls -al /proc/2473/fd
ÇÕ°è 0
dr-x------    2 root     root            0  5¿ù 28 16:07 .
dr-xr-xr-x    3 root     root            0  5¿ù 28 16:07 ..
lrwx------    1 root     root           64  5¿ù 28 16:14 0 -> /dev/ttyp1
lrwx------    1 root     root           64  5¿ù 28 16:14 1 -> /dev/ttyp1
lrwx------    1 root     root           64  5¿ù 28 16:14 2 -> /dev/ttyp1
lr-x------    1 root     root           64  5¿ù 28 16:14 3 -> /home/mycvs/test/zipcode.txt
lrwx------    1 root     root           64  5¿ù 28 16:14 4 -> socket:[171434]
			
0, 1, 2 ´Â °¢°¢ Ç¥ÁØÀÔ·Â, Ç¥ÁØÃâ·Â, Ç¥ÁØ¿¡·¯¸¦ °¡¸®Å°´Â ÆÄÀÏÁö½ÃÀÚ ¶ó´Â°ÍÀº ÀÌ¹Ì ¾Ë°í ÀÖÀ»°ÍÀÌ´Ù. 3 Àº ÇÁ·Î±×·¥ÀÌ ¿¬ ÆÄÀÏÀ» °¡¸®Å²´Ù. ¸¶Áö¸· 4°¡ ¹Ù·Î socket Åë½ÅÀ» À§ÇØ ¸¸µé¾îÁø ÆÄÀÏ Áö½ÃÀÚÀÌ´Ù. ´Ù¸¥ °ÍµéÀÌ Å͹̳ÎÀ̳ª ÆÄÀÏÀ» °¡¸®Å°´Â°Í°ú´Â ´Þ¸® socket ¸¦ °¡¸® ۰í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.

¿©±â¿¡ »õ·Î¿î Ŭ¶óÀÌ¾ðÆ®°¡ Á¢±ÙÀ»Çϸé (telnet À̳ª Àü¿ëŬ¶óÀÌ¾ðÆ® ¸¦ ÀÌ¿ëÇØ¼­) ´ÙÀ½°ú °°Àº ÆÄÀÏ Áö½ÃÀÚ°¡ Çϳª Ãß°¡ µÉ°ÍÀÌ´Ù.

lrwx------    1 root     root           64  5¿ù 28 16:14 5 -> socket:[171435]
			


1.4. socket API

À̹ø¿¡´Â socket ·¹À̾¼­ Á¦°øÇÏ´Â ¼ÒÄÏ °ü·Ã ÇÔ¼öµéÀ» ¼³¸íÇϵµ·Ï ÇϰڴÙ.


1.4.1. ¼ÒÄÏ »ý¼º ¹× ¿¬°á

1.4.1.1. socket(2) ÇÔ¼ö

ÀÌ·¯ÇÑ ¼ÒÄÏ Àº socket(2) ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø´Ù. ÃÖÃÊ socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¼ÒÄÏÀ» »ý¼ºÇϸé Ä¿³ÎÀº Åë½ÅÀ» À§ÇÑ Á¾Á¡(end point,Áï Åë½Å¿¬°á»óȲÀ» üũÇÏ´Â)À» »ý¼ºÇϰí, ¿©±â¿¡ ´ëÇÑ ÆÄÀÏ Áö½ÃÀÚ¸¦ µÇµ¹·ÁÁØ´Ù. ÇÁ·Î±×·¥Àº socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ »ý¼ºÇÑ ÆÄÀÏ Áö½ÃÀÚ¿¡ »õ·Î¿î ¿¬°áÀÌ µé¾î¿À´Â Áö¸¦ È®ÀÎÇÏ°Ô µÈ´Ù.

À§¿¡ ÀÖ´Â TCP/IP 4°èÃþÀ» º¸¸é Socket Layer ¾Æ·¡¿¡´Â ÃÖ¼ÒÇÑ 2°³ ÀÌ»óÀÇ »ç¿ë°¡´ÉÇÑ µ¥ÀÌŸ ±×·¥ÀÇ Å¸ÀÔÀÌ ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ µ¥ÀÌŸ ±×·¥ÀÇ Å¸ÀÔ¿¡´Â TCP, UDP, RAW µîÀÌ ÀÖ´Ù. TCP ¼ÒÄÏ, UDP ¼ÒÄÏ, RAW ¼ÒÄÏÀ̶ó°í ºÎ¸£±âµµ ÇÑ´Ù. ¶ÇÇÑ ´Ù¾çÇÑ ¼ÒÄÏ ÁÖ¼ÒÆÐ¹Ð¸®(±º)¸¦ Á¦°øÇÑ´Ù.

표 1. ¼ÒÄÏÁÖ¼Ò ÆÐ¹Ð¸®

UNIXÀ¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏ, IPC ¿ëÀ¸·Î ¸¹ÀÌ »ç¿ëÇÑ´Ù.
INETTCP/IP ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇÑ ÀÎÅͳÝÁÖ¼Ò ÆÐ¹Ð¸®, º¸ÅëÀÇ ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö½Ã ÁÖ·Î »ç¿ë
IPX³ëº§ÀÇ IPX ÇÁ·ÎÅäÄÝ, °ÔÀÓÀ» ÁÁ¾ÆÇÑ´Ù¸é ¸¹ÀÌ µé¾îºÃÀ½Á÷ÇÑ
AX25¾Æ¸¶Ãß¾î ¶óµð¿À X.25
X25X.25 ÇÁ·ÎÅäÄÝ

±×·¯¹Ç·Î socket ÇÔ¼ö´Â À§ÀÇ ¼ÒÄÏ ÁÖ¼Ò ÆÐ¹Ð¸®¿Í ¼ÒÄÏ Å¸ÀÔ ÁöÁ¤ÀÌ °¡´ÉÇØ¾ß ÇÑ´Ù.

int socket(int domain, int type, int protocol);
					
ù¹øÂ° ¾Æ±Ô¸ÕÆ®°¡ ¼ÒÄÏÁÖ¼Ò ÆÐ¹Ð¸® ÁöÁ¤À» À§Çؼ­ »ç¿ëµÇ¸ç, µÎ¹øÂ° ¾Æ±Ô¸ÕÆ®°¡ ¼ÒÄÏ Å¸ÀÔÁöÁ¤À» À§Çؼ­ »ç¿ëµÈ´Ù. ¼ÒÄÏÁÖ¼Ò ÆÐ¹Ð¸®´Â ÁÖ·Î INET(AF_INET), UNIX(AF_UNIX) °¡ »ç¿ëµÇ¸ç, ¼ÒÄÏŸÀÔÀº TCP(SOCK_STREAM), UDP(SOCK_DGRAM), RAW(SOCK_RAW) °¡ »ç¿ëµÈ´Ù.

Áï ÀÎÅÍ³Ý ÇÁ·ÎÅäÄÝÀ» ÀÌ¿ëÇÏ´Â TCP ¼ÒÄÏÀ» ¸¸µé±â ¿øÇÑ´Ù¸é socket(AF_INET, SOCK_STREAM, 0) °ú °°ÀÌ »ç¿ëÇÏ¸é µÈ´Ù.

socket ÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é, »ç¿ë°¡´ÉÇÑ ¼ÒÄÏÀ» °¡¸£Å°´Â ÆÄÀÏ Áö½ÃÀÚ¸¦ µÇµ¹·ÁÁÖ¸ç, ÀÌ ÆÄÀÏÁö½ÃÀÚ´Â endpoint(¿¬°á È®ÀÎ Åë·Î) ·Î½á »ç¿ëµÈ´Ù.


1.4.1.2. bind(2) ÇÔ¼ö

socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø ¼ÒÄÏ¿¡ À̸§À» ºÎ¿©ÇÑ´Ù.

¶ó°í ¹ø¿ªµÈ man ÆäÀÌÁöȤÀº °ü·ÃµÈ ¹ø¿ª¼­¿¡¼­ ¼³¸íÀ» Çϰí ÀÖÁö¸¸, ¼ÒÄÏ¿¡ Ư¼ºÀ» ºÎ¿©(¼ÒÄϰú Ư¼ºÀ» ¹­´Â´Ù(bind))ÇÑ´Ù ¶ó´Â°Ô Á»´õ Àû´çÇÑ ¼³¸íÀÌ ¾Æ´Ò±î ½Í´Ù.

int bind(int  sockfd, struct sockaddr *my_addr, socklen_t addrlen);
					
ÀÎÀÚ·Î ÁÖ¾îÁø sockfd ¿¡´ëÇØ¼­ sockaddr À» ÀÌ¿ëÇØ¼­ Ư¼ºÀ» ¹­¾îÁØ´Ù. bind ÇÔ¼ö¸¦ ÅëÇØ¼­ ¿ì¸®´Â sockfd °¡ »ç¿ëÇÒ Æ÷Æ®¹øÈ£(port), ±×¸®°í ¿¬°áÀ» ¹Þ¾ÆµéÀÏ IP ÁÖ¼Ò Æ¯¼ºµîÀ» ¹­¾îÁÙ¼ö ÀÖ´Ù. IP ÁÖ¼Ò´Â IPv4, IPv6 µîÀÌ »ç¿ëµÉ¼ö ÀÖÀ»°ÍÀÌ´Ù.

bind ÇÔ¼ö´Â º¸Åë ¼­¹ö¿¡¼­ »ç¿ëµÈ´Ù. ±× ÀÌÀ¯´Â ´ëºÎºÐÀÇ ¼­ºñ½º(HTTP, FTP..)µéÀÌ ÁöÁ¤µÈ Æ÷Æ®¹øÈ£¸¦ ÅëÇØ¼­ ¼­ºñ½º µÇ±â ¶§¹®ÀÌ´Ù. ¹Ý¸é Ŭ¶óÀ̾ðÆ®ÀÇ °æ¿ì Ä¿³Î¿¡¼­ ÇÒ´çÇÑ ÀÓÀÇÀÇ Æ÷Æ®¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ ¼­¹ö¿Í ¿¬°áÇϱ⠶§¹®¿¡ bind ¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù.


1.4.1.3. connect(2) ÇÔ¼ö

int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
					
À̰ÍÀº Ŭ¶óÀ̾ðÆ®Ãø ¿¡¼­ »ç¿ëµÇ¸ç, struct sockaddr ±¸Á¶Ã¼¿¡ ¼¼ÆÃµÈ ³»¿ë´ë·Î ¼­¹öÃø¿¡ ¿¬°áÇÑ´Ù. sockaddr ±¸Á¶Ã¼¿¡´Â ¿¬°áµÉ ¼­¹ö¿¡ ´ëÇÑ Á¤º¸µé, Áï ÁÖ¼Ò ÆÐ¹Ð¸® IP ¹øÈ£¿Í PORT ¹øÈ£ µîÀÌ µé¾î°¡ ÀÖÀ¸¸ç, connect ÇÔ¼ö´Â sockaddr Á¤º¸¸¦ ÀÌ¿ëÇØ¼­ ¼­¹öÃø¿¡ ¿¬°áÀ» ÇÏ¸ç ¼­¹ö¿ÍÀÇ Åë½ÅÀ» À§ÇÑ endpoint ¿Í sockfd ¸¦ ¿¬°á½ÃŲ´Ù. sockfd ´Â socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø ¼ÒÄÏ ÁöÁ¤ ¹øÈ£ÀÌ´Ù.


1.4.1.4. listen(2) ÇÔ¼ö

int listen(int sockfd, int backlog);
					
¼­¹öÃø¿¡¼­ »ç¿ëµÇ¸ç socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¸¸µé¾îÁø sockfd ¿¡ ´ëÇØ¼­, µé¾î ¿À´Â ¿¬°áÀ» ±â´Ù¸°´Ù. backlog ´Â ¾ÆÁ÷ ¿ÏÀüÈ÷ ¿¬°áµÇÁö ¾ÊÀº ¿¬°áµéÀÌ ´ë±âÇÒ queue ÀÇ ±æÀ̸¦ ¸í½ÃÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù.


1.4.1.5. accept(2) ÇÔ¼ö

int accept(int s,  struct  sockaddr  *addr,  socklen_t *addrlen); 
					
listen(2) À» ÅëÇØ¼­ ¸¸µé¾îÁø ¹Ì¿¬°áÀÇ ´ë±â¿­¿¡¼­ °¡Àå ¾Õ¿¡ ÀÖ´Â ¿¬°áÀÇ ³»¿ëÀ» °¡Á®¿Í¼­ »õ·Î¿î ¿¬°á ¼ÒÄÏÀ» ¸¸µé¾îÁØ´Ù. »õ·Î¸¸µé¾îÁø ¿¬°á¼ÒÄÏÀº ÆÄÀÏ Áö½ÃÀÚ¸¦ ÇÒ´çÇÏ¿©¼­ ¸®ÅÏÇØÁÖ°Ô µÇ¸ç, ¿ì¸®´Â ¸®ÅÏµÈ ÆÄÀÏ Áö½ÃÀÚ¸¦ ÀÌ¿ëÇØ¼­ »õ·Î¸¸µé¾îÁø ¼ÒÄϰú Åë½ÅÀ» ÇÒ¼ö ÀÖ°Ô µÈ´Ù.


1.4.2. ÀÔÃâ·Â ÇÔ¼ö

À¯´Ð½º¿¡¼­ ¼ÒÄÏÀº ÆÄÀϰú µ¿ÀÏÇÏ°Ô Ãë±Þ µÇ±â ¶§¹®¿¡ read(), write()¿Í°°Àº ½Ã½ºÅÛ ÇÔ¼ö¸¦ ÀÌ¿ëÇØµµ ´ëºÎºÐÀÇ ÀÔÃâ·ÂÀ» ´Ù·ê ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌµé ½Ã½ºÅÛ ÇÔ¼öµéÀº ³×Æ®¿öÅ©ÀÇ Æ¯¼ºÀ» °í·ÁÇÏÁö ¾Ê°í ¸¸µé¾ú±â ¶§¹®¿¡ ³×Æ®¿öÅ© Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏ´Â ÀÛ¾÷À» Çϱ⿡´Â Àû´çÇÏÁö ¾ÊÀº Á¡ÀÌ ÀÖ´Ù.

¿¹¸¦µé¾î UDP¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÒ°æ¿ì Àбâ´Â ¹®Á¦¾øÁö¸¸ ¾²±â¿¡´Â ¹®Á¦°¡ »ý±æ ¼ö ÀÖ´Ù. UDP´Â ¿¬°á ¼ÒÄÏÀ» ¸¸µéÁö ¾Ê±â ¶§¹®¿¡ ¾µ¶§ ¿¬°áµÈ È£½ºÆ®ÀÇ Á¤º¸¸¦ ¾Ë ¼ö°¡ ¾ø±â ¶§¹®¿¡ write()ÇÔ¼ö·Î´Â µ¥ÀÌÅ͸¦ Àü¼ÛÇÒ ¼ö ¾ø°Ô µÈ´Ù. ÀÌ·²°æ¿ì¿¡´Â ¼ÒÄÏ API¸¦ »ç¿ëÇØ¼­ Åë½ÅÀ» ÇØÁÖ¾î¾ß ÇÑ´Ù.


1.4.2.1. ÀÔ·ÂÇÔ¼ö - recvfrom/recvmsg

¼ÒÄÏÀ¸·Î ºÎÅÍ µ¥ÀÌÅ͸¦ ¹Þ±â À§Çؼ­ »ç¿ëÇÑ´Ù.

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

ssize_t  recvfrom(int s, void *buf, size_t len, int flags, struct sock-
addr *from, socklen_t *fromlen);

ssize_t recvmsg(int s, struct msghdr *msg, int flags);
					
¼ÒÄÏ ÁöÁ¤ÀÚ s·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àд ÀÏÀ» ÇÑ´Ù. µÑ´Ù ¿¬°áÁöÇâ ¼ÒÄϰú ºñ¿¬°áÁöÇâ ¼ÒÄÏ ¸ðµÎ¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. º¸Åë recvfrom()ÇÔ¼ö°¡ »ç¿ëÇϱ⿡ Á÷°üÀûÀÎ °ü°è·Î ½±°Ô »ç¿ëÇÒ ¼ö ÀÕ´Ù. ¼ÒÄÏÀ¸·Î ºÎÅÍ len ¸¸Å­ µ¥ÀÌÅ͸¦ Àоî¿Í¼­ buf¿¡ ÀúÀåÇÑ´Ù. ¶ÇÇÑ 5¹øÂ° ÀÎÀÚÀÎ from¸¦ ÅëÇØ¼­ µ¥ÀÌÅ͸¦ º¸³½ È£½ºÆ®ÀÇ ÀÎÅÍ³Ý Á¤º¸¸¦ ¾ò¾î ¿Ã ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î ºñ¿¬°á ÁöÇâ ¼ÒÄÏÀ» »ç¿ëÇÏ´õ¶óµµ ÀÌ ÀÎÅÍ³Ý Á¤º¸¸¦ ÅëÇØ¼­ µ¥ÀÌÅ͸¦ ¼ö½ÅÇÒ ¸ñÀûÁö È£½ºÆ®¸¦ °áÁ¤ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. fromlen´Â sockaddr ±¸Á¶Ã¼ÀÇ ±æÀÌ´Ù. ³ª¸ÓÁö ÀÚ¼¼ÇÑ ³»¿ëÀº recvform(2)ÀÇ ¸ÇÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.


1.4.2.2. Ãâ·ÂÇÔ¼ö - sendto/sendmsg

¼ÒÄÏÀ¸·Î µ¥ÀÌÅ͸¦ º¸³»±â À§Çؼ­ »ç¿ëÇÑ´Ù.

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

ssize_t  sendto(int  s,  const  void *buf, size_t len, int flags, const
struct sockaddr *to, socklen_t tolen);
ssize_t sendmsg(int s, const struct msghdr *msg, int flags);
					
¿ª½Ã Á÷°üÀûÀÎ sendto¸¦ ³Î¸® »ç¿ëÇÑ´Ù. ¼ÒÄÏ ÁöÁ¤ÀÚ s¿¡ lenÅ©±â¸¸Å­ bufÀÇ ³»¿ëÀ» º¸³½´Ù. to¸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌÅ͸¦ ¹ÞÀ» È£½ºÆ®¸¦ ¸í½ÃÇÒ ¼ö ÀÖ´Ù. sendto()¿Í recvfrom()ÇÔ¼öÀÇ »ç¿ë¿¹´Â UDP ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö À» Âü°íÇϱ⠹ٶõ´Ù.


1.4.3. ÀÎÅÍ³Ý ÁÖ¼Òº¯È¯

ÀÎÅÍ³Ý ÁÖ¼Ò ÀÚü°¡ Àΰ£ÀÌ ÀÎÁöÇϱ⠾î·Á¿î ¼ö·Î µÇ¾î ÀÖ´Ù º¸´Ï À̰ÍÀ» °ü¸®Çϱ⠽±µµ·Ï Á¡¹ÚÀÌ 3ÇüÁ¦ ½ºÅ¸ÀÏÀÇ ÀÎÅÍ³Ý ÁÖ¼Òü°è¸¦ ¸¸µé¾î¼­ °ü¸®ÇÏ°í ¿©±â¿¡ ¶Ç µµ¸ÞÀÎ À̸§À» Á༭ ½±°Ô ±â¾ïÇÒ ¼ö ÀÖµµ·Ï Çϰí ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó³ª »ç¿ëÀÚ´Â º¸Åë µµ¸ÞÀÎ À̸§À̳ª Á¡¹ÚÀÌ 3ÇüÁ¦ ½ºÅ¸ÀÏÀÇ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ »ç¿ëÇÏ°Ô µÇ´Âµ¥, ½ÇÁ¦ ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡¼­´Â 32bit ÁÖ¼Ò ÇüÅ·Πº¯È¯ ½ÃÄÑÁà¾ßÇÒ Çʿ䰡 ÀÖ´Ù.

¿©±â¿¡¼­´Â À̵é ÁÖ¼Ò°£ º¯È¯°ú °ü·ÃµÈ ÇÔ¼ö¸¦ ¼Ò°³ÇÑ´Ù.


1.4.4. ÀÎÅÍ³Ý ÁÖ¼Ò <-> 32bit ÁÖ¼Ò

inet_addr(3), inet_aton(3), inet_network(3), inet_ntoa(3) ÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ÀÎÅÍ³Ý ÁÖ¼Ò¿Í 32bit ÁÖ¼Ò°£ º¯È¯À» ÇÒ ¼ö ÀÖ´Ù. inet_addr(3)°ú inet_network(3)ÇÔ¼ö´Â Á¡¹ÚÀÌ 3ÇüÀç ½ºÅ¸ÀÏ ÀÎÅÍ³Ý ÁÖ¼Ò·Î ºÎÅÍ 32bit ÁÖ¼Ò¸¦ ¾ò±â À§Çؼ­, inet_aton(3)°ú inet_ntoa(3)±× ¹Ý´ëÀÇ º¯È¯ °ªÀ» ¾ò±â À§Çؼ­ »ç¿ëÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº man ÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù(±×³É ÇÔ¼ö ¸µÅ©¸¦ Ŭ¸¯ÇÏ¸é µÈ´Ù).


1.4.5. µµ¸ÞÀÎ À̸§ -> 32bit ÁÖ¼Ò

Á¡¹ÚÀÌ 3ÇüÁ¦ ½ºÅ¸ÀÏÀÇ ÀÎÅÍ³Ý ÁÖ¼Ò´Â È®½ÇÈ÷ °ü¸®Çϱâ ÁÁ°í ¿Ü¿ì±â¿¡ Á»´õ ÆíÇϱä ÇÏÁö¸¸ ¼ýÀÚ·Î µÇ¾î ÀÖ´Ù´Â °Í ¶§¹®¿¡ ÀÎÅÍ³Ý ¼­ºñ½º¸¦ À§ÇÑ È£½ºÆ® ÁÖ¼Ò·Î »ç¿ëÇϱ⿣ Àû´çÇÏÁö ¾Ê´Ù. ±×·¡¼­ ÀÎÅÍ³Ý ÁÖ¼Ò¿¡ À̸§À» ÁÖ´Â ¼­ºñ½º°¡ ¸¸µé¾îÁö°Ô µÇ¾ú´Âµ¥ µµ¸ÞÀÎ ¼­ºñ½ºÀÌ´Ù. µµ¸ÞÀÎ ¼­ºñ½º´Â µµ¸ÞÀÎ À̸§¿¡ ´ëÇÑ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ µÇµ¹·Á ÁÖ´Â ÀÏÀ» ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ÀÎÅÍ³Ý ÁÖ¼Ò º¯È¯¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù.


1.4.5.1. gethostbyname/gethostbyaddr

µµ¸ÞÀÎ À̸§¿¡¼­ ÀÎÅÍ³Ý ÁÖ¼Ò¸¦ ¾ò¾î¿À´Â ÀÏÀ» ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº gethostbyname(3)°ú getbyaddr(3)ÀÇ ¸ÇÆäÀÌÁö¸¦ Âü°í Çϱâ¹Ù¶õ´Ù.


1.4.6. ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¿À´õ

³×Æ®¿öÅ© Åë½ÅÀ» ÇÏ´Ùº¸¸é CPUÀÇ ¹ÙÀÌÆ® ¿À´õ°¡ ´Ù¸¥ ÀÌÀ¯·Î À̸¦ Ç¥ÁØ ¹ÙÀÌÆ® ¿À´õÀÎ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¿À´õ·Î º¯È¯Çؼ­ º¸³»°í, ¹Þ¾ÆµéÀÎ µ¥ÀÌÅʹ ȣ½ºÆ®ÀÇ ¹ÙÀÌÆ® ¿À´õ¿¡ ¸Â°Ô ´Ù½Ã º¯°æ½ÃÄÑÁÖ´Â ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·¯ÇÑ ÀÛ¾÷À» À§Çؼ­ ¼ÒÄÏÀº ¸î °³ÀÇ ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¹ÙÀÌÆ® ¿À´õ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº endian¿¡ ´ëÇØ¼­ ¸¦ Âü°íÇϱ⠹ٶõ´Ù.


1.4.6.1. È£½ºÆ® ¹ÙÀÌÆ® ¿À´õ -> ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¿À´õ

htonl(3), htons(3) ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÀüÀÚ´Â 4byte µ¥ÀÌÅÍ, ÈÄÀÚ´Â 2byte µ¥ÀÌÅ͸¦ ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¿À´õ¸¦ µû¸£µµ·Ï º¯È¯ÇÑ´Ù.


1.4.6.2. ³×Æ®¿öÅ© ¹ÙÀÌÆ® ¿À´õ -> È£½ºÆ® ¹ÙÀÌÆ® ¿À´õ

ntohl(3), ntohs(3) ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÀüÀÚ´Â 4byteµ¥ÀÌÅÍ, ÈÄÀÚ´Â 2byteµ¥ÀÌÅ͸¦ È£½ºÆ® ¹ÙÀÌÆ® ¿À´õ¸¦ µû¸£µµ·Ï º¯È¯ÇÑ´Ù.


1.4.6.3. ¿£µð¾È °Ë»ç ÇÔ¼ö

ÀÌ°Ç º¸³Ê½º´Ù. ÇöÀç CPUÀÇ ¹ÙÀÌÆ® ¿À´õ ¹æ½ÄÀ» ¾Ë·Á ÁÖ´Â °£´ÜÇÑ ÇÔ¼ö´Ù.

int endian(void)
{
	int i = 0x00000001;
	if ( ((char *)&i)[0] )
		return LITTLE_ENDIAN;
	else
		return BIG_ENDIAN;
}
					


2. ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ÀϹÝ

2.1. ¼­¹öÃø socket »ý¼º ¼ø¼­

´ÙÀ½Àº ¼­¹öÃøÀÇ ¼ÒÄÏ »ý¼º ¼ø¼­¸¦ ³ª¿­ÇÑ °ÍÀÌ´Ù.

  1. ¼­¹öÃøÀÇ ¼ÒÄÏ »ý¼º¼ø¼­´Â ÃÖÃÊ socket ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ endpoint ¼ÒÄÏ, Áï Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÀ» µè±â À§ÇÑ ¼ÒÄÏÀ» »ý¼ºÇÏ°Ô µÈ´Ù. ÀÌ ¼ÒÄÏÀº ¼­¹ö°¡ Á¾·áµÉ¶§±îÁö ³²¾ÆÀÖ°Ô µÈ´Ù.

  2. bind ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¼ÒÄÏÆ¯¼ºÀ» ¹­¾îÁØ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© port ¹øÈ£¸¦ ÁöÁ¤ÇØÁÖ¸ç, ¹Þ¾ÆµéÀÏ IPÁÖ¼Ò¿¡ ´ëÇÑ ¼³Á¤À» ÇÑ´Ù.

  3. listen ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© µè±â ¼ÒÄÏ(socket ÇÔ¼ö¸¦ ÅëÇØ¼­ ¸¸µé¾îÁø) ¿¡ ¿¬°áÀÌ ÀÖ´ÂÁö ±â´Ù¸°´Ù. ¸¸¾à ¿¬°áÀÌ ÀÖ´Ù¸é, ¿¬°á ´ë±â¿­(queue)¿¡ ½×¾Æ³õ´Â´Ù.

  4. accept ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¿¬°á ´ë±â¿­¿¡ ´ë±âÁßÀÎ ¿¬°áÀÌ ÀÖ´Ù¸é ÇØ´ç ¿¬°á¿¡ ´ëÇÏ¿© »õ·Î¿î ¼ÒÄÏÀ» ¸¸µé°í ¸¸µé¾îÁø ¼ÒÄÏ¿¡ ´ëÇÑ ÆÄÀÏ Áö½ÃÀÚ¸¦ µÇµ¹·ÁÁØ´Ù. ÀÌ ¼ÒÄÏÀº Àбâ/¾²±â·Î ¸¸µé¾îÁø´Ù. ¸¸¾à ¿¬°á ´ë±â¿­¿¡ ´ë±âÁßÀÎ ¿¬°áÀÌ ¾ø´Ù¸é (±âº»ÀûÀ¸·Î) ÇØ´ç ¿µ¿ª¿¡¼­ ºÀ¼â(block)µÈ´Ù.

  5. read, write µîÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» ÇÑ´Ù.


2.2. Ŭ¶óÀÌ¾ðÆ® Ãø socket »ý¼º¼ø¼­

´ÙÀ½Àº Ŭ¶óÀ̾ðÆ®ÃøÀÇ ¼ÒÄÏ »ý¼º ¼ø¼­¸¦ ³ª¿­ÇÑ °ÍÀÌ´Ù. ¼­¹öÃø¿¡ ºñÇÏ¿©¼­ ÈνŠ°£´ÜÇÏ°Ô ÀÌ·ç¾îÁüÀ» ¾Ë¼ö ÀÖ´Ù.

  1. ÃÖÃÊ socket ¸¦ ÀÌ¿ëÇÏ¿© endpoint ¼ÒÄÏÀ» »ý¼ºÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ® À̹ǷΠÀ̰ÍÀº µè±â ¼ÒÄÏÀÌ ¾Æ´Ï°í, ¿¬°á ¼ÒÄÏÀÌ µÉ°ÍÀÌ´Ù. (À̸§¸¸ ´Ù¸¦»Ó »ç½Ç µè±â ¼ÒÄϰú ¿¬°á ¼ÒÄÏÀÇ ±¸ºÐÀº ¾ø´Ù)

  2. connect ¸¦ ÀÌ¿ëÇÏ¿© ¼­¹ö¿¡ ¿¬°áÇÑ´Ù.

  3. read, write µîÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ¼­¹ö¿Í Åë½ÅÇÑ´Ù.


3. °á·Ð

ÀÌ»ó Socket Layer ÀÇ °³³ä°ú Socket Layer ¿¡¼­ Á¦°øÇÏ´Â Socket API ¿¡ ´ëÇÑ °£´ÜÈ÷ ¾Ë¾Æ º¸¾Ò´Ù. ¿©±â¿¡ ÀÖ´Â API µéÀº °¡Àå ±âº»ÀûÀÎ(Åë½ÅÀ» À§Çؼ­ ÇÊ¿äÇÑ) ÇÔ¼öµéÀÌ´Ù. ³ª¸ÓÁö Á»´õ ¼¼¹ÐÇÑ ÇÔ¼öµé¿¡ ´ëÇØ¼­´Â Unix NetWork Programming µîÀÇ ¼­ÀûÀ» Âü°íÇϱ⠹ٶõ´Ù.

¿©±â¿¡ ÀÖ´Â ¼ÒÄÏ API µéÀÇ »ç¿ë¿¹´Â ÀÌ »çÀÌÆ®¿¡¼­ ÃæºÐÈ÷ ã¾Æº¼¼ö ÀÖÀ»°ÍÀÌ´Ù.




category_network
programing
category__5
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.