setsockopt - ¼ÒÄϿɼÇ
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 ¼ÒÄϿɼÇ
1.1 SO_REUSEADDR
1.2 ¼ÒÄÏ ¹öÆÛ
1.3 TCP_NODELAY
1.4 SO_LINGER
2 Âü°í¹®Çå
3 È÷½ºÅ丮

1 ¼ÒÄϿɼÇ

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

´ÙÀ½Àº À̵é ÇÔ¼öÀÇ »ç¿ë¹æ¹ýÀÌ´Ù.
#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_OOBINLINE BOOL OOB µ¥ÀÌÅÍ Àü¼ÛÀ» ¼³Á¤ÇÒ¶§, ÀÏ¹Ý ÀԷ ť¿¡¼­ µ¥ÀÌÅ͸¦ ÀÐÀ» ¼ö ÀÖ°Ô ÇÑ´Ù. ÀÌ Ç÷¡±×¸¦ ÄѸé recv³ª send¿¡¼­ MSG_OOB Ç÷¡±×¸¦ »ç¿ëÇÒ ÇÊ¿ä ¾øÀÌ OOB µ¥ÀÌÅ͸¦ ÀÐÀ» ¼ö ÀÖ´Ù.
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 ¾Ë°í¸®Áò Á¦¾î

1.1 SO_REUSEADDR

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

1.2 ¼ÒÄÏ ¹öÆÛ

SO_SNDBUF´Â Àü¼Û¼ÒÄÏ¿¡¼­ »ç¿ëÇÒ ÃÖ´ë ¹öÆÛÀÇ Å©±â¸¦ ¼³Á¤ÇÑ´Ù. Ä¿³ÎÀº setsockopt·Î ¼³Á¤ ÇÑ °ªÀÇ 2¹è¸¦ ¹öÆÛ Å©±â·Î Àâ´Â´Ù. Àü¼Û¼ÒÄÏ ¹öÆÛÀÇ ±âº» Å©±â´Â /proc/sys/net/core/wmem_default¿¡¼­, ¼³Á¤ °¡´ÉÇÑ ÃÖ´ë Å©±â´Â /proc/sys/net/core/wmem_max¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù.

SO_RCVBUF´Â ¼ö½Å¼ÒÄÏ¿¡¼­ »ç¿ëÇÒ ÃÖ´ë ¹öÆÛ Å©±â¸¦ ¼³Á¤ÇÑ´Ù. Ä¿³ÎÀº setsockopt·Î ¼³Á¤ ÇÑ °ªÀÇ 2¹è¸¦ ¹öÆÛ Å©±â·Î Àâ´Â´Ù. Àü¼Û¼ÒÄÏ ¹öÆÛÀÇ ±âº» Å©±â´Â /proc/sys/net/core/rmem_default¿¡¼­, ¼³Á¤ °¡´ÉÇÑ ÃÖ´ë Å©±â´Â /proc/sys/net/core/rmem_max¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½Àº ¼ÒÄϹöÆÛÀÇ Å©±â¸¦ °¡Á®¿À°í ¼³Á¤ÇÏ´Â ¿ÏÀüÇÑ ÄÚµå´Ù.
#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 **artv) 
{ 
    int s; 
    int bsize = 0; 
    int rn; 
    rn = sizeof(int); 
    s = socket(AF_INET, SOCK_STREAM, 0); 
 
    // ÇöÀç Àü¼Û ¼ÒÄÏ ¹öÆÛÀÇ Å©±â¸¦ °¡Á®¿Â´Ù. 
    getsockopt(s, SOL_SOCKET, SO_SNDBUF, &bsize, (socklen_t *)&rn); 
    printf("Send buf size : %d\n", bsize); 
 
    // ÇöÀç ¹öÆÛ Å©±â¿¡ * 2¸¦ÇÑ´Ù. 
    bsize = bsize * 2; 
    setsockopt(s, SOL_SOCKET, SO_SNDBUF, &bsize, (socklen_t)rn); 
 
    // ÇöÀç ¹öÆÛÅ©±â¸¦ °¡Á®¿Â´Ù.  
    // Ä¿³ÎÀº * 2¸¸Å­ ¹öÆÛÅ©±â¸¦ ¼³Á¤ÇϹǷÎ, ÃÖÃÊ Å©±âÀÇ 4¹è¸¸Å­ ¼³Á¤µÆÀ» °ÍÀÌ´Ù. 
    getsockopt(s, SOL_SOCKET, SO_SNDBUF, &bsize, (socklen_t *)&rn); 
    printf("Send buf size : %d\n", bsize); 
} 
 

SO_RCVBUF´Â ¼ÒÄÏÀÇ window Å©±â¸¦ °áÁ¤ÇÑ´Ù. windows Å©±â¿¡ ´ëÇÑ ³»¿ëÀº windows size¹®¼­¸¦ Âü°íÇÑ´Ù.

1.3 TCP_NODELAY

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

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

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

Upload new Attachment "nagle.png"

1.4 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¿¡ ÁöÁ¤µÈ ½Ã°£¸¸Å­ ºí·°»óÅ¿¡¼­ ´ë±âÇÑ´Ù. ¸¸¾à ÁöÁ¤µÈ ½Ã°£³»¿¡ µ¥ÀÌÅ͸¦ ¸ðµÎ º¸³Â´Ù¸é ¸®ÅÏÀÌ µÇ°í, ½Ã°£ÀÌ ÃʰúµÇ¾ú´Ù¸é ¿¡·¯¿Í ÇÔ²² ¸®ÅÏÀÌ µÈ´Ù.

2 Âü°í¹®Çå

3 È÷½ºÅ丮

  • ¼öÁ¤ : 2011³â 12¿ù 26ÀÏ


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