¸ÖƼij½ºÆ® ÇÁ·Î±×·¡¹Ö... ȤÀº, ¿ì¸®¸¸ÀÇ ÀÀ¿ëÇÁ·Î±×·¥ ÀÛ¼ºÇϱâ.
¸ÖƼij½ºÆ®¸¦ Áö¿øÇϱâ À§Çؼ ¸î °¡Áö È®ÀåµÈ ÀÀ¿ë ÇÁ·Î±×·¡¹Ö ÀÎÅÍÆäÀ̽º(API)°¡ ÇÊ¿äÇÏ´Ù. ±× °¡¿îµ¥ ´ëºÎºÐÀº setsockopt() (Ä¿³Î¿¡ Á¤º¸¸¦ Àü´ÞÇÔ) ¿Í getsockopt() (¸ÖƼij½ºÆ® °ü·Ã Á¤º¸ ±¸ÇÔ) µÎ °¡Áö ½Ã½ºÅÛ È£ÃâÀ» ÅëÇØ Ã³¸®ÇÑ´Ù. »õ·Î¿î ½Ã½ºÅÛ È£Ã⠵ΰ³°¡ ¸ÖƼij½ºÆ®¸¦ Áö¿øÇϱâ À§ÇØ Ãß°¡µÇ¾ú´Ù´Â ¶æÀÌ ¾Æ´Ï´Ù. setsockopt()/getsockopt()´Â 4.2 BSD ½ÃÀýºÎÅÍ ÀÖ¾ú´Ù. ´ÜÁö Ä¿³Î¿¡ Àü´ÞÇØ ÁÖ¾î¾ßÇÏ´Â »õ·Î¿î ¸ÖƼij½ºÆ® ¿É¼ÇÀÌ Ãß°¡µÇ¾úÀ» »ÓÀÌ´Ù.
setsockopt()/getsockopt() ÇÔ¼öÀÇ ¼±¾ðÀÌ´Ù.
int getsockopt(int s, int level, int optname, void* optval, int* optlen); int setsockopt(int s, int level, int optname, const void* optval, int optlen);
ù ¹ø° º¯¼ö s´Â ½Ã½ºÅÛ È£ÃâÀ» Àû¿ëÇÒ ¼ÒÄÏÀÌ´Ù. ¸ÖƼij½ºÆ®¿¡¼ ÀÌ ¼ÒÄÏÀº AF_INET °è¿ À̾î¾ßÇϸç, ¼ÒÄÏ Å¸ÀÔÀº SOCK_DGRAM ¶Ç´Â SOCK_RAW¸¦ ¾µ ¼ö ÀÖ´Ù. ´ëºÎºÐÀº SOCK_DGRAMÀ¸·Î ¾²Áö¸¸, ¶ó¿ìÆà µ¥¸óÀ» Á¦ÀÛÇϰųª ¼öÁ¤ÇÒ °èȹÀ̶ó¸é SOCK_RAW ÀÌ ÇÊ¿äÇÒÁö ¸ð¸¥´Ù.
µÎ ¹ø° º¯¼ö levelÀº ¿É¼ÇÀ̳ª, ÁúÀÇ(query), ¸Þ½ÃÁö(message)¸¦ ó¸®ÇÒ ·¹À̾ ÀǹÌÇÑ´Ù. ¼ÒÄÏ ·¹À̾î´Â SOL_SOCKET, IP ·¹À̾î´Â IPPROTO_IP, µîµîÀÌ´Ù. ¸ÖƼij½ºÆ® ÇÁ·Î±×·¡¹Ö¿¡ levelÀº Ç×»ó IPPROTO_IP À̾î¾ß ÇÑ´Ù.
optnameÀº ¿ì¸®°¡ ¼³Á¤ °ªÀ» ÁöÁ¤ÇÏ´Â °ÍÀÎÁö ¾òÀ¸·Á ÇÏ´Â °ÍÀÎÁö¸¦ ÀǹÌÇÑ´Ù. ¼³Á¤ °ª ÀÚü´Â(Ä¿³Î¿¡ ¼³Á¤Çϰųª Ä¿³Î·ÎºÎÅÍ Àоî¿À´Â µÎ °æ¿ì ¸ðµÎ) optvalÀÌ´Ù. ¸ÖƼij½ºÆ® ÇÁ·Î±×·¡¹Ö¿¡¼ optnames´Â ´ÙÀ½°ú °°´Ù.
optname setsockopt() getsockopt() IP_MULTICAST_LOOP yes yes IP_MULTICAST_TTL yes yes IP_MULTICAST_IF yes yes IP_ADD_MEMBERSHIP yes no IP_DROP_MEMBERSHIP yes no
optlenÀº optvalÀÌ °¡¸®Å°´Â µ¥ÀÌÅͱ¸Á¶ÀÇ Å©±â¸¦ ÀǹÌÇÑ´Ù. ´Ü, getsockopt()¿¡¼´Â ¹Ýȯ °ªÀÌ µÈ´Ù. Ä¿³ÎÀº optname °ªÀ» optvalÀÌ °¡¸®Å°´Â ¹öÆÛ¿¡ ½á³ÖÀº ÈÄ optlenÀ» ÅëÇØ ÀÚ·áÀÇ Å©±â¸¦ ¾Ë·ÁÁØ´Ù.
setsockopt()/getsockopt()¸ðµÎ ½ÇÇà °á°ú ¼º°øÇϸé 0, ¿¡·¯°¡ ¹ß»ýÇϸé -1À» ¹ÝȯÇÑ´Ù.
ÇÁ·Î±×·¡¸Ó¶ó¸é, µ¥ÀÌÅ͸¦ È£½ºÆ®·Î ·çÇÁ¹é ½Ãų °ÍÀÎÁö °áÁ¤ÇؾßÇÑ´Ù. ¸¸ÀÏ, ÇÁ·Î¼¼½º°¡ ¿©·¯ °³À̰ųª µ¥ÀÌÅ͸¦ ¸®½º´×"listening"ÁßÀÎ »ç¿ëÀÚ°¡ ÀÖ´Ù¸é ·çÇÁ¹éÀ» °¡´ÉÇÏ°Ô ÇؾßÇÑ´Ù. ÇÏÁö¸¸, Ä«¸Þ¶ó À̹ÌÁö¸¦ Àü¼ÛÇϴµ¥ ÀÚ±â ȸ鿡¼ À̹ÌÁö¸¦ º¼ ÇÊ¿ä°¡ ¾ø´Ù¸é, ¾Æ¸¶µµ ·çÇÁ¹éÀÌ ÇÊ¿ä ¾øÀ» °ÍÀÌ´Ù. ÈÄÀÚÀÇ °æ¿ì ÇÁ·Î±×·¥Àº ÄÄÇ»ÅÍ¿¡ ºÎÂøµÈ Ä«¸Þ¶ó·ÎºÎÅÍ ¿µ»óÀڷḦ ÀÌ¹Ì °¡Áö°í ÀÖÀ» °ÍÀ̱⠶§¹®¿¡, ´Ù½Ã ¼ÒÄÏÀ¸·ÎºÎÅÍ ÀڷḦ ¹Þ±â ¿øÇÏ´Â °æ¿ì´Â µå¹° °ÍÀÌ´Ù. ·çÇÁ¹éÀº ±âº» °ªÀ¸·Î È°¼ºÈµÇ¾î ÀÖ´Ù.
optvalÀÌ Æ÷ÀÎÅÍÀ̱⠶§¹®¿¡ ´ÙÀ½Ã³·³ Çؼ´Â ¾È µÈ´Ù.
setsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP, 0, 1);
·çÇÁ¹éÀ» Á¤Áö½ÃÅ°·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÏ°í
u_char loop; setsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop));
·çÇÁ¹éÀ» È°¼ºÈ½ÃÅ°·Á¸é loop¸¦ 1·Î, ÁßÁö½ÃÅ°·Á¸é 0À¸·Î ¼³Á¤ÇÑ´Ù.
¼ÒÄÏÀÇ ÇöÀç ·çÇÁ¹é»óŸ¦ È®ÀÎÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
u_char loop; int size;
getsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, &size)
Ưº°È÷ ÁöÁ¤ÇÏÁö ¾Ê´Â´Ù¸é, ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥Àº Áö¿ª ³×Æ®¿÷ ¿ÜºÎ·Î Àü¼ÛµÇ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ TTL 1À» ±âº» °ªÀ¸·Î Àü¼ÛµÈ´Ù. TTLÀ» ¿øÇÏ´Â °ªÀ¸·Î(0¿¡¼ 255±îÁö) ¹Ù²Ù±â À§Çؼ TTL°ªÀ» º¯¼ö¿¡ ³Ö°í ÇÁ·Î±×·¥¿¡¼ ´ÙÀ½°ú °°ÀÌ ½áÁÖ¸é µÈ´Ù.(¿©±â¼´Â "ttl"À̶ó°í Çß´Ù.)
u_char ttl; setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
IP_MULTICAST_LOOP¿¡¼¿Í Èí»çÇÏ´Ù.
ÀϹÝÀûÀ¸·Î ½Ã½ºÅÛ °ü¸®ÀÚ´Â ±âº» ÀÎÅÍÆäÀ̽º¸¦ ÁöÁ¤Çϸç, ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥Àº ±×ÂÊÀ¸·Î º¸³»Áø´Ù. ÇÁ·Î±×·¡¸Ó´Â ÀÌ ¿É¼ÇÀ» »ç¿ëÇÏ¿© ÁöÁ¤µÈ ±âº» ÀÎÅÍÆäÀ̽º¸¦ ¹«½ÃÇÏ°í Á¤ÇØÁø ¼ÒÄÏ¿¡¼ »ç¿ëÇÒ ÀÎÅÍÆäÀ̽º¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.
struct in_addr interface_addr; setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr));
ÀÌÈĺÎÅÍ ÀÌ ¼ÒÄÏ¿¡¼ »ý¼ºµÈ ¸ðµç ¸ÖƼij½ºÆ® Æ®·¡ÇÈÀº À§¿¡¼ ¼±ÅÃÇÑ ÀÎÅÍÆäÀ̽º·Î Ãâ·ÂµÈ´Ù. ¿ø·¡ ¼³Á¤À» ȸº¹ÇÏ¿© °ü¸®ÀÚÀÇ ¼³Á¤À» ¹«½ÃÇÏ°í Ä¿³ÎÀÌ ¿ÜºÎ Ãâ·Â ÀÎÅÍÆäÀ̽º¸¦ ¼±ÅÃÇϵµ·Ï ÇÏ·Á¸é ÀÎÅÍÆäÀ̽º¿¡ INADDR_ANY¸¦ ¼³Á¤ÇÏ°í À§¿Í µ¿ÀÏÇÑ ¿É¼ÇÀ¸·Î setsockopt()¸¦ È£ÃâÇÑ´Ù.
¿ÜºÎ Ãâ·Â ÀÎÅÍÆäÀ̽º¸¦ ¼±ÅÃÇÔ¿¡ ÀÖ¾î¼, ´ÙÀ½ ioctlÀÌ À¯¿ëÇÒ °ÍÀÌ´Ù. SIOCGIFADDR (ÀÎÅÍÆäÀ̽º ÁÖ¼Ò ¾ò±â), SIOCGIFCONF (Àüü ÀÎÅÍÆäÀ̽º ¸ñ·Ï ¾ò±â), SIOCGIFFLAGS (ÀÎÅÍÆäÀ̽º »óÅ Ç÷¡±×(flag)¸¦ ¾ò¾î¼ ÀÎÅÍÆäÀ̽º°¡ ¸ÖƼij½ºÆ® °¡´ÉÇÑÁö È®ÀÎ - IFF_MULTICAST Ç÷¡±×-).
È£½ºÆ®°¡ ¸ÖƼij½ºÆ® ¶ó¿ìÅÍ·Î ÀÛµ¿ÇÑ´Ù¸é, ¿©·¯ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í Àְųª IP_MULTICAST_IF¿É¼ÇÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ» °æ¿ì, ´Ù¸¥ ÀÎÅÍÆäÀ̽º¿¡¼ ¸ÖƼij½ºÆ® Æ÷¿öµùÀÌ °¡´ÉÇÏ´õ¶óµµ ¸ÖƼij½ºÆ®´Â ±âº» ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù.
Ä¿³Î¿¡ ¿ì¸®°¡ ¾î¶² ±×·ì¿¡ °ü½ÉÀÌ ÀÖ´ÂÁö ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù°í Çß´ø °ÍÀ» ´Ù½Ã »ý°¢ÇØ º¸ÀÚ. ±×·ì¿¡ °ü½É ÀÖ´Â ÇÁ·Î¼¼½º°¡ Çϳªµµ ¾ø´Ù¸é, ±× ±×·ìÀ» ÇâÇؼ Àü¼ÛµÇ¾î¿À´Â ÆÐŶÀº ¸ðµÎ Æó±âµÈ´Ù. µû¶ó¼ Ä¿³Î¿¡ ¿ì¸®ÀÇ °ü½É ±×·ìÀ» ¾Ë¸®°í, ±×·ìÀÇ È¸¿ø(member)ÀÌ µÇ±â À§Çؼ´Â ´ÙÀ½°úÁ¤ÀÌ ÇÊ¿äÇÏ´Ù. ¿ì¼± ip_mreq ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ä¿î´Ù. ±×¸®°í, optvalÀ» ¼³Á¤ÇÏ¿© setsockopt()¸¦ È£ÃâÇؼ Ä¿³Î¿¡ ÀÌ ±¸Á¶Ã¼¸¦ ³Ñ°ÜÁÖ¸é µÈ´Ù.
ip_mreq ±¸Á¶Ã¼´Â (/usr/include/linux/in.h¿¡ ÀÖÀ½) ´ÙÀ½°ú °°´Ù.
struct ip_mreq { struct in_addr imr_multiaddr; /* IP multicast address of group */ struct in_addr imr_interface; /* local IP address of interface */ };
ÁÖÀÇ : ÀÌ ±¸Á¶Ã¼ÀÇ "¹°¸®Àû" Á¤ÀÇ´Â À§ÀÇ ÆÄÀÏ¿¡ ¸í½ÃµÇ¾î ÀÖ´Ù. ÇÏÁö¸¸, ÄÚµåÀÇ À̽ļºÀ» À§Çؼ <linux/in.h>À» Æ÷ÇÔ(include)½ÃÄѼ´Â ¾È µÈ´Ù. ´ë½Å <linux/in.h>¸¦ Æ÷ÇÔÇÏ´Â <netinet/in.h>À» Æ÷ÇÔ½ÃÄѶó.
ù ¹ø° ¸â¹ö, imr_multiaddr´Â ¿ì¸®°¡ Âü¿©ÇÒ ±×·ìÁÖ¼Ò¸¦ ¸»ÇÑ´Ù. ȸ¿ø(membership)Àº ±×·ì»Ó¸¸ ¾Æ´Ï¶ó ÀÎÅÍÆäÀ̽º¿¡µµ °ü·ÃÀÌ ÀÖ´Ù´Â Á¡À» ¸í½ÉÇؾßÇÑ´Ù. µû¶ó¼, µÎ ¹ø° ¸â¹ö, imr_interface°ªµµ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. ¿ì¸®°¡ ºÐ»êµÈ È£½ºÆ®¿¡ ÀÖ´õ¶óµµ ÀÌ·¯ÇÑ ¹æ½ÄÀ¸·Î °¢±â ´Ù¸¥ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇÏ¿© °°Àº ±×·ì¿¡ Âü¿©ÇÒ ¼ö ÀÖ´Ù. imr_interface´Â ¿ÍÀϵåÄ«µå ÁÖ¼Ò(INADDR_ANY)¸¦ ÀÌ¿ëÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ °æ¿ì ÀÎÅÍÆäÀ̽º¸¦ ¼±ÅÃÇÏ´Â ÀÏÀº Ä¿³ÎÀÌ ÇÑ´Ù.
ÀÏ´Ü ÀÌ ±¸Á¶Ã¼¸¦ ä¿ì¸é (struct ip_mreq mreq;·Î Á¤ÀÇ Çß´Ù°í Çϸé) ´ÙÀ½ ¹æ¹ýÀ¸·Î setsockopt()¸¦ È£ÃâÇÏ¸é µÈ´Ù.
setsockopt (socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
µ¿ÀÏ ¼ÒÄÏÀ¸·Î ¿©·¯ ±×·ì¿¡ Âü¿© ÇÒ ¼ö ÀÖ´Ù´Â Á¡¿¡ ÁÖ¸ñÇ϶ó. ±×·ì ¼ö Á¦ÇÑÀº IP_MAX_MEMBERSHIPS¿¡ Á¤ÀǵǾî ÀÖÀ¸¸ç Ä¿³Î¹öÀü 2.0.33¿¡¼ 20ÀÌ´Ù.
ÀÌ °úÁ¤Àº ±×·ì¿¡ Âü¿©ÇÏ´Â °Í°ú À¯»çÇÏ´Ù.
struct ip_mreq mreq; setsockopt (socket, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq));
¿©±â¼ mreq´Â ±×·ì¿¡ Âü¿© ÇÒ ¶§ »ç¿ëÇß´ø °Í°ú µ¿ÀÏÇÑ ±¸Á¶Ã¼´Ù. imr_interface¿¡ INADDR_ANY¸¦ »ç¿ëÇÑ´Ù¸é Ä¿³ÎÀÌ ¼±ÅÃÇÑ Ã¹ ¹ø° ÀÎÅÍÆäÀ̽º°¡ Á¦°ÅµÈ´Ù.
°°Àº ¼ÒÄÏÀ¸·Î ¾ÆÁÖ ¸¹Àº ±×·ì¿¡ Âü¿©ÇßÀ» °æ¿ì ¿¬°áÀ» Á¾·áÇϱâ À§ÇØ ¸ðµç ȸ¿ø °ü°è¸¦ »èÁ¦ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¼ÒÄÏÀ» ´ÝÀ¸¸é ¿¬°áµÈ ¸ðµç ȸ¿ø °ü°è´Â Ä¿³ÎÀÌ ÀÇÇØ »èÁ¦µÈ´Ù. ¼ÒÄÏÀ» ¿¬ ÇÁ·Î¼¼½º¸¦ Á¾·á(kill)½Ãų ¶§µµ µ¿ÀÏÇÏ´Ù.
³¡À¸·Î ±×·ì¿¡¼ ȸ¿øÀ» Á¦°ÅÇÏ´Â °úÁ¤ÀÌ È£½ºÆ®·Î ÇÏ¿©±Ý ±× ±×·ìÀ¸·Î ¿À´Âµ¥ÀÌÅͱ׷¥À» ¹ÞÁö ¸øÇϵµ·Ï ÇÏ´Â °ÍÀ» ÀǹÌÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. µ¿ÀÏ ÀÎÅÍÆäÀ̽º·Î ±× ±×·ì¿¡ Âü¿©ÇÑ ¼ÒÄÏÀÌ IP_DROP_MEMBERSHIPÀÇ »óÅ°¡ µÇ´õ¶óµµ È£½ºÆ®´Â ±×·ì ¸â¹öÀÇ ¸ñ·ÏÀ» º¸°üÇÑ´Ù.
ADD_MEMBERSHIP °ú DROP_MEMBERSHIP Àº ¼º°ø, ½ÇÆÐ ¿©ºÎ¸¦ Áï½Ã ¹ÝȯÇÑ´Ù. (nonblocking operations)