À©¼Ó ÇÁ·Î±×·¡¹Ö ±âº»
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 À©¼Ó¿¡ ´ëÇØ¼­
1.1 BSD Socket¿ÍÀÇ ¸î °¡Áö Â÷ÀÌÁ¡
2 À©¼Ó ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö
2.1 ¹Ì¸® ¾Ë¾Æ µÎ¸é ÁÁÀº Á¤º¸µé
2.2 ¼ÒÄÏ¿¡ ´ëÇØ¼­
2.2.1 ¼ÒÄÏ ÀÚ·á Çü
2.3 ¼ÒÄÏ ¸¸µé±â
2.4 ¼ÒÄÏ Æ¯¼º ¹­±â
2.5 ¿¬°á ´ë±â¿­ ¸¸µé±â
2.6 ¿ø°Ý ¼ÒÄÏ¿¡ ¿¬°á Çϱâ
2.7 ¿¬°á ¿äû °¡Á®¿À±â
2.8 ¼ÒÄÏ Åë½Å
2.9 ¼ÒÄÏ ´Ý±â
2.10 winsock.dll ·Îµù
2.11 ¼­¹ö ÇÁ·Î±×·¥ È帧
2.12 Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ È帧
3 ¿¹Á¦
3.1 ¼­¹ö ¿¹Á¦
3.2 Ŭ¶óÀÌ¾ðÆ® ¿¹Á¦
4 À©¼Ó È®Àå ÇÔ¼ö
4.1 Áßø ÀÔÃâ·Â ¸ðµ¨
4.2 ºñµ¿±â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ¸ðµ¨

1 À©¼Ó¿¡ ´ëÇØ¼­

À©¼Ó(winsock)Àº windows Socket APIÀÇ ÁÙÀÓ¸»·Î, À©µµ ¿î¿µÃ¼Á¦ ±â¹ÝÀÇ ³×Æ®¿öÅ© ÇÁ·Î±×·¥À» °³¹ßÇϱâ À§ÇÑ ±â¼ú¿ä¼ÒµéÀÌ Àû¿ëµÈ °³¹ß µµ±¸´Ù. BSD socket¸¦ ±â¹ÝÀ¸·Î Çϰí À־, ¸®´ª½ºÈ¯°æ¿¡¼­ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °æÇèÀÌ ÀÖ´Ù¸é ¾î·ÆÁö ¾Ê°Ô ÀûÀÀÇÒ ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ ¼ÒÄÏ ÇÔ¼öµµ ±×´ë·Î »ç¿ëÇÑ´Ù.

1.1 BSD Socket¿ÍÀÇ ¸î °¡Áö Â÷ÀÌÁ¡

BSD Socket APIÀÇ °ÅÀÇ ÀüºÎ¸¦ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ´ÙÀ½°ú °°Àº ¸î °¡Áö Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù.
  • dll ·Îµå : winsock.dllÀ» ·ÎµùÇØ¾ß ÇÑ´Ù. À̸¦ À§ÇØ ¸î °³ÀÇ ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.
  • ¼ÒÄÏ ÁöÁ¤ ¹øÈ£ : ¸®´ª½º´Â ¼ÒÄÏ ÁöÁ¤ ¹øÈ£°¡ °ð ÆÄÀÏ ÁöÁ¤ ¹øÈ£·Î ÀÚ·áÇüÀº signed int ÀÌ´Ù. À©¼ÓÀº ¼ÒÄÏÀ» °¡¸®Å°±â À§Çؼ­ SOCKETÀ» »ç¿ëÇϴµ¥, unsigned int ÇüÀÌ´Ù. ±×·¯¹Ç·Î Æ÷ÆÃ ÀÛ¾÷À» ½±°Ô Çϱâ À§Çؼ­ int ÇüÀ» »ç¿ëÇØµµ Å« ¹®Á¦´Â ¾ø´Ù. ´ë½Å ÄÄÆÄÀÏ·¯ÀÇ Á¾·ù¿¡ µû¶ó¼­ °æ°í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÒ ¼öµµ ÀÖ´Ù. °¡´ÉÇϸé SOCKET ÀÚ·á ÇüÀ» ±×´ë·Î »ç¿ëÇÏ´Â°Ô ÁÁÀ» °Í °°´Ù.

2 À©¼Ó ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö

BSD ¼ÒÄϰú µ¿ÀÏ ÇØ¼­ ¸®´ª½º ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö°ú ¸¹Àº ºÎºÐ¿¡¼­ Áߺ¹µÇ±ä ÇÏÁö¸¸ ±×·¡µµ ´Ù·ç¾îº¼ »ý°¢ÀÌ´Ù. ¼ÒÄÏ API ·¹ÆÛ·±½º ¹®¼­´Â BSD ¼ÒÄÏ API¹®¼­¸¦ Âü°íÇÏ¸é µÈ´Ù. À©¼Ó ·¹ÆÛ·±½º ¹®¼­´Â ¾Æ´ÏÁö¸¸ ¹®Á¦ ¾øÀ» °ÍÀÌ´Ù. À©¼ÓÇÔ¼ö ´ëºÎºÐÀÌ BSD ¼ÒÄÏÇÔ¼ö¿Í µ¿ÀÏÇϹǷÎ, ÇÔ¼ö ¼³¸íÀº ºñ±³Àû °£´ÜÈ÷ ³Ñ¾î°¥ °ÍÀÌ´Ù. ¾ðÁ¦ ½Ã°£ÀÌ µÇ¸é À©¼Ó ·¹ÆÛ·±½º ¹®¼­µµ ¸¸µé°í ½Í´Ù.

2.1 ¹Ì¸® ¾Ë¾Æ µÎ¸é ÁÁÀº Á¤º¸µé

¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀ» óÀ½ Á¢ÇÏ´Â °Å¶ó¸é, TCP/IP¸¦ ¸ÕÀú °øºÎÇÏ´Â °É °­ÃßÇÑ´Ù. TCP/IP

2.2 ¼ÒÄÏ¿¡ ´ëÇØ¼­

¼ÒÄÏÀº ÀÎÅͳÝ(ÀÎÅÍ ³×Æ®¿öÅ©)»ó¿¡¼­ ¹°¸®ÀûÀ¸·Î ¶³¾îÁ®ÀÖ´Â ¼ÒÇÁÆ®¿þ¾î¿Í ¼ÒÇÁÆ®¿þ¾î°£ÀÇ Åë½ÅÀ» ´ã´çÇÏ´Â "¼ÒÇÁÆ®¿þ¾î Åë½Å µµ±¸"´Ù. ¶§¶§·Î ¼ÒÄÏÀº ÄÄÇ»ÅÍ¿Í ÄÄÇ»Å͸¦ ¿¬°áÇÏ´Â Åë½Å µµ±¸¶ó°í ¼³¸íµÇ±âµµ ÇÏÁö¸¸, Á¤È®È÷ ¾ð±ÞÇÒ Çʿ䰡 ÀÖÀ» °Í °°´Ù. ¼ÒÄÏÀº ÀÎÅͳÝÀÇ Á¾´Ü¿¡ À§Ä¡Çϸ鼭 ¼ÒÇÁÆ®¿þ¾î¿Í ¼ÒÇÁÆ®¿þ¾î¸¦ ¿¬°áÇÑ´Ù.

À¥ ¼­ºñ½º¸¦ ¿¹·Î µé¾îº¸ÀÚ¸é, ¼ÒÄÏÀº Ŭ¶óÀ̾ðÆ®ÀÎ firefox¿Í ¼­¹öÀÎ apache°¡ ¼­·Î Åë½ÅÀ» ÇÒ ¼ö ÀÖµµ·Ï ¿¬°áÀ» ÇÑ´Ù. ¼ÒÄÏÀ» ÀÌ¿ëÇØ¼­ firefox´Â apache¼­¹ö·Î À¥ ÆäÀÌÁö ¿äûÀ» Çϰí, apache ¼­¹ø´Â ¿äûÀ» ºÐ¼®Çؼ­ À¥ÆäÀÌÁö¸¦ firefox¿¡ Àü¼ÛÇÑ´Ù.

2.2.1 ¼ÒÄÏ ÀÚ·á Çü

À¯´Ð½º´Â ¸ðµç ÀÚ¿øÀ» ÆÄÀÏ·Î ´Ù·é´Ù. ¼ÒÄÏ¿ª½Ã ¿¹¿Ü´Â ¾Æ´Ï¶ó¼­ ÆÄÀÏ·Î ´Ù·é´Ù. ±×¸®°í ¸ðµç ÆÄÀÏ °ü·Ã ÇÔ¼ö´Â signed int ÇüÀÇ ÆÄÀÏ ÁöÁ¤ ¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ ÆÄÀÏÀ» Á¦¾îÇÑ´Ù.

ÀÌ·¯ÇÑ À¯´Ð½ºÀÇ Æ¯¼ºÀ¸·Î BSD ¼ÒÄϵµ intÇüÀÇ ÆÄÀÏ ÁöÁ¤ ¹øÈ£¸¦ ÀÌ¿ëÇØ¼­ ¼ÒÄÏÀ» ´Ù·é´Ù. À¯´Ð½º¿¡¼­ ÆÄÀÏ ÁöÁ¤ ¹øÈ£´Â ¼ÒÄÏÀ» Áö½ÃÇÑ´Ù.

À©µµ´Â ÀÚ¿øÀ» ÆÄÀÏÀÌ ¾Æ´Ñ °¢°¢ÀÇ µ¶¸³µÈ Ä¿³Î °´Ã¼·Î º¸¸ç, ÀÌµé °´Ã¼´Â ÆÄÀÏ ÁöÁ¤ ¹øÈ£°¡ ¾Æ´Ñ HANDLE (ÇÚµé)ÀÌ¿ë ÇØ¼­ Á¦¾îÇÑ´Ù. ¿¹ÄÁµ¥, °´Ã¼ÀÇ ÀνºÅϽº¸¦ ´Ù·ç´Â ¹æ½ÄÀÌ´Ù. ÀÌ·± À©µµÀÇ Æ¯¼º»ó ¼ÒÄÏ ¿ª½Ã ¼ÒÄÏ ÇÚµé·Î ´Ù·ç¾î¾ß ÇϰÚÁö¸¸, BSD ¼ÒÄϰúÀÇ È£È¯À» À¯ÁöÇϱâ À§Çؼ­ unsigned int ¸¦ Àç Á¤ÀÇÇÑ (¼ÒÄÏ ÁöÁ¤ ¹øÈ£) SOCKÀ¸·Î ¼ÒÄÏÀ» ´Ù·é´Ù. ¼ÒÄÏÀ» Áö½ÃÇϱ⠶§¹®¿¡ ¼ÒÄÏ Áö½ÃÀÚ¶ó°í ºÎ¸¥´Ù. ±âº»ÀûÀ¸·Î À©µµ´Â ÆÄÀϰú ¼ÒÄÏÀ» ´Ù¸¥ °´Ã¼·Î º»´Ù.

À¯´Ð½º¿Í ºñ±³Çϸé signed ÁöÁ¤¿¡ ´ëÇÑ Â÷À̸¸ Àֱ⠶§¹®¿¡, À¯´Ð½º·ÎÀÇ Æ÷ÆÃÀ» °í·ÁÇÑ´Ù¸é SOCK ´ë½Å signed int¸¦ ½áµµ ¹«¹æÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ´Ù¸¸ À©µµ¿¡¼­ ÄÄÆÄÀÏ ÇÒ°æ¿ì, ÄÄÆÄÀÏ·¯ÀÇ Á¾·ù¿¡ µû¶ó¼­ °æ°í ¸Þ½ÃÁö°¡ ¹ß»ýÇÒ ¼ö´Â ÀÖ´Ù.

2.3 ¼ÒÄÏ ¸¸µé±â

Åë½ÅÀ» Çϱâ À§Çؼ­´Â socketÇÔ¼ö·Î ÀÎÅͳÝÀÇ Á¾´Ü¿¡ À§Ä¡ÇÒ ¼ÒÄÏÀ» ¸¸µé¾î¾ß ÇÑ´Ù.
SOCKET WSAAPI socket( 
  __in  int af, 
  __in  int type, 
  __in  int protocol 
); 
 
af ´Â ÁÖ¼Ò ¿µ¿ªÀ» ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ¿¹ÄÁµ¥, ÀÏ¹Ý ÀÎÅÍ³Ý ¿µ¿ª¿¡¼­ Åë½ÅÇÒ °ÇÁö, ¾Æ´Ï¸é IPX¿µ¿ª¿¡¼­ Åë½ÅÇÒ °ÇÁö µîÀ» °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. À¯º°³­ °æ¿ì°¡ ¾Æ´Ï¶ó¸é ÀÎÅÍ³Ý ¿µ¿ª Åë½ÅÀ» À§Çؼ­ AF_INET¸¦ »ç¿ëÇÑ´Ù. À¯´Ð½º´Â ¼ÒÄÏÀ» IPC(³»ºÎ ÇÁ·Î¼¼½º Åë½Å) ¿ëµµ·Î »ç¿ëÀ» ÇÒ ¼ö ÀÖ´Ù. À̸¦ À§Çؼ­ AF_UNIX¸¦ »ç¿ëÇÒ ¼ö Àִµ¥, À©¼ÓÀº ³»ºÎ Åë½Å ¸ÅÄ¿´ÏÁòÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.

type´Â ¼ÒÄÏ Å¸ÀÔÀ» ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ¿¬°á ÁöÇâÀÇ TCP Åë½ÅÀ̶ó¸é SOCK_STREAM,, UDP¸¦ ÀÌ¿ëÇÑ µ¥ÀÌŸ ±×·¥ Áß½ÉÀÇ ºñ ¿¬°á ÁöÇâ Åë½ÅÀ̶ó¸é SOCK_DGRAMÀ» »ç¿ëÇÑ´Ù.

protocol´Â ¼ÒÄÏÀÌ »ç¿ëÇÒ ÇÁ·ÎÅäÄÝÀ» ÁöÁ¤ÇÑ´Ù. type¿Í ÇÔ²² ½ÖÀ¸·Î ÁöÁ¤ÇÑ´Ù. SOCK_STREAM À̶ó¸é IPPROTO_TCP, SOCK_DGRAMÀ̶ó¸é IPPROTO_UDP¸¦ »ç¿ëÇÑ´Ù.

Áï ¿¬°áÁöÇâÀÇ ÀÎÅÍ³Ý ¼ÒÄÏÀ» »ç¿ëÇÒ °Å¶ó¸é ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÑ´Ù.
SOCKET sock; 
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
 

2.4 ¼ÒÄÏ Æ¯¼º ¹­±â

socketÇÔ¼ö·Î ¸¸µç ¼ÒÄÏÀÌ Á¢Á¡¿¡ ³õÀ̱â Àü¿¡, ¼ÒÄÏ Æ¯¼ºÀ» ¹­¾î¾ß ÇÑ´Ù. Áï ¾î¶² ÀÎÅÍ³Ý ÁÖ¼Ò ¿µ¿ª¿¡ ´ëÇØ¼­ ¾î¶² Æ÷Æ®¹øÈ£·Î ±â´Ù¸± °ÇÁö¿¡ ´ëÇÑ Á¤º¸¸¦ ¼ÒÄÏ¿¡ ÁöÁ¤ÇØ Áà¾ß ÇÑ´Ù. bindÇÔ¼ö·Î ÀÌ ÀÏÀ» ÇÒ ¼ö ÀÖ´Ù.
int bind( 
  __in  SOCKET s, 
  __in  const struct sockaddr *name, 
  __in  int namelen 
); 
 
¼ÒÄÏ Áö½ÃÀÚ s¿¡ sockaddr ±¸Á¶Ã¼ÀÇ Á¤º¸¸¦ ÁöÁ¤ÇÑ´Ù. struct sockaddr ±¸Á¶Ã¼´Â ´ÙÀ½°ú °°´Ù.
struct sockaddr { 
        ushort  sa_family; 
        char    sa_data[14]; 
}; 
 
struct sockaddr_in { 
        short   sin_family; 
        u_short sin_port; 
        struct  in_addr sin_addr; 
        char    sin_zero[8]; 
}; 
 
sin_family¿Í sa_family´Â ¼­·Î µ¿ÀÏÇÑ °ªÀ¸·Î ¾î¶² ÁÖ¼Òü°è¸¦ »ç¿ëÇÒ °ÍÀÎÁö¸¦ ¸í½ÃÇÑ´Ù. sa_familyÀÇ °ª¿¡ µû¶ó¼­ sa_data¿¡ ´ëÇÑ ÇØ¼®ÀÌ ´Þ¶óÁø´Ù. ¸¸¾à sa_family°¡ AF_INET¶ó¸é ÀÎÅÍ³Ý ÁÖ¼Ò Ã¼°è Á¤º¸¸¦ °¡Áö´Â sockaddr_in ±¸Á¶Ã¼°¡ »ç¿ëµÈ´Ù. sockaddr_in ±¸Á¶Ã¼¿¡´Â Æ÷Æ®, »ç¿ëÇÒ ÀÎÅÍ³Ý ÁÖ¼Ò Á¤º¸¸¦ Æ÷ÇÔÇϰí ÀÖ´Ù.
struct sockaddr_in SockInfo; 
 
... .... 
 
SockInfo.sin_family = AF_INET;   
SockInfo.sin_port = htons( 1234 );   
SockInfo.sin_addr.s_addr = htonl(INADDR_ANY);   
 
status = bind( EndpointSocket, (struct sockaddr*)&SockInfo, sizeof( struct sockaddr_in) );   
if( status == SOCKET_ERROR)    
{   
    printf("Bind Error\n");   
    return 0;   
}   
 
INADDR_ANY´Â 0.0.0.0 ÁÖ¼Ò¸¦ °¡¸®Å°´Âµ¥, ¸ðµç »ç¿ë °¡´ÉÇÑ ÁּҷκÎÅÍ ±â´Ù¸®°Ú´Ù´Â Àǹ̴Ù. ÁÖ·Î ¸ðµç ÀÎÅÍ³Ý ÁÖ¼Ò·Î ±â´Ù·Á¾ß ÇÏ´Â ¼­¹ö¿¡¼­ »ç¿ëÇÏ´Â °ªÀÌ´Ù.

bindÇÔ¼ö´Â ¼­¹ö ÇÁ·Î±×·¥¿¡¼­ ÁÖ·Î »ç¿ëµÈ´Ù. ¼­ºñ½º Æ÷Æ®°¡ °íÁ¤µÇ¾î¾ß ÇÏ´Â ¼­¹ö ÇÁ·Î±×·¡±×·¥°ú ´Þ¸® Ŭ¶óÀÌ¾ðÆ®´Â Æ÷Æ®°¡ ÀÓÀÇ·Î ÇÒ´çµÇ±â ¶§¹®¿¡ ±»ÀÌ bindÇÔ¼ö·Î ÁÖ¼Ò Á¤º¸¸¦ ¹­¾î ÁÙ Çʿ䰡 ¾ø±â ¶§¹®ÀÌ´Ù. bindÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾ÊÀ» °æ¿ì, ¿î¿µÃ¼Á¦°¡ ¾Ë¾Æ¼­ Æ÷Æ®¸¦ ÇÒ´çÇÑ´Ù.

2.5 ¿¬°á ´ë±â¿­ ¸¸µé±â

Ä¿³ÎÀÌ Å¬¶óÀÌ¾ðÆ®·Î ºÎÅÍ ¿äûÀ» ¹ÞÀ¸¸é, ¿ì¼± ¿¬°á ´ë±â¿­ (listen queue)·Î ¿¬°áÀÌ µé¾î°£´Ù. ÇÁ·Î±×·¥Àº Ŭ¶óÀÌ¾ðÆ® ¿¬°áÀ» Á÷Á¢ ¹Þ´Â °ÍÀÌ ¾Æ´Ï¶ó, ¿¬°á ´ë±â¿­ÀÇ °¡Àå ¾Õ ºÎºÐ¿¡ ÀÖ´Â ¿¬°á¿äûÀ» °¡Á®¿Í¼­ Ŭ¶óÀÌ¾ðÆ®¿ÍÀÇ ¿¬°áÀ» ¸¸µç´Ù.

¿¬°á ´ë±â¿­Àº listenÇÔ¼ö·Î ¸¸µç´Ù.
int listen( 
  __in  SOCKET s, 
  __in  int backlog 
); 
 
´ë±â¿­ÀÇ Å©±â´Â backlog·Î Á¤ÇÑ´Ù. °æÇè°ªÀ¸·Î Á¤ÇØÁø °ªÀº ¾ø´Ù. ÀϹÝÀûÀ¸·Î 5Á¤µµ¸é ¹«³­ÇÑ °Í °°´Ù.

2.6 ¿ø°Ý ¼ÒÄÏ¿¡ ¿¬°á Çϱâ

Ŭ¶óÀÌ¾ðÆ®´Â connectÇÔ¼ö·Î ¿ø°Ý ¼ÒÄÏ¿¡ ¿¬°áÇÒ ¼ö ÀÖ´Ù.
int connect( 
  __in  SOCKET s, 
  __in  const struct sockaddr *name, 
  __in  int namelen 
); 
 
sockaddrÀÇ ÀÎÅÍ³Ý ÁÖ¼Ò/Æ÷Æ®·ÎÀÇ ¿¬°áÀ» ½ÃµµÇÑ´Ù.
serveraddr.sin_family = AF_INET;  
serveraddr.sin_addr.s_addr = inet_addr("111.111.111.111");  
serveraddr.sin_port = htons(12345);  
  
if (connect(ClientSocket, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) == SOCKET_ERROR)  
{  
    WSACleanup();  
    return 1;  
}  
 
ÀÎÅÍ³Ý ÁÖ¼Ò 111.111.111.111ÀÇ Æ÷Æ®¹øÈ£ 12345¿¡ ¿¬°áµÈ ÇÁ·Î±×·¥¿¡ ¿¬°áÀ» ½ÃµµÇϰí ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â Ŭ¶óÀÌ¾ðÆ®¿¡¼­ »ç¿ëÇÑ´Ù.

2.7 ¿¬°á ¿äû °¡Á®¿À±â

¼­¹ö´Â connectÇÔ¼ö·Î ¿¬°áÀ» ¿äûÇϴ Ŭ¶óÀÌ¾ðÆ®¸¦ ±â´Ù¸°´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ connectÇÔ¼ö¸¦ È£ÃâÇØ¼­ ¿¬°áÀÌ ¸¸µé¾î Áö¸é, ÀÌ ¿¬°áÀº '¿¬°á ´ë±â¿­'¿¡ µé¾î°¡°Ô µÈ´Ù. ¼­¹ö´Â acceptÇÔ¼ö·Î ¿¬°á ´ë±â¿­¿¡ ÀÖ´Â ¿äûÀ» °¡Á®¿Í¼­ Ŭ¶óÀÌ¾ðÆ®¿Í Åë½Å¿¡ »ç¿ëÇÒ '¿¬°á ¼ÒÄÏ'À» ¸¸µç´Ù.
SOCKET accept( 
  __in     SOCKET s, 
  __out    struct sockaddr *addr, 
  __inout  int *addrlen 
); 
 

2.8 ¼ÒÄÏ Åë½Å

ÆÄÀϰú ¼ÒÄÏÀ» ´Ù¸£°Ô º¸±â ¶§¹®¿¡, ReadFile, WriteFile°ú °°Àº ÆÄÀÏ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. ´ë½Å À©¼Ó¿¡¼­ Á¦°øÇÏ´Â ¼ÒÄÏ ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. BSD °è¿­ ÇÔ¼öÀÎ recv¿Í sendÇÔ¼ö·Î Åë½ÅÇÒ ¼ö ÀÖ´Ù.

recv¿Í sendÇÔ¼ö´Â ¿¬°á ÁöÇâ ¼ÒÄÏ Åë½ÅÀ» À§Çؼ­, recvfrom¿Í sendtoÇÔ¼ö´Â µ¥ÀÌÅÍ ±×·¥ ÁöÇâ ¼ÒÄÏ Åë½ÅÀ» À§Çؼ­ »ç¿ëµÈ´Ù.

2.9 ¼ÒÄÏ ´Ý±â

closesocketÇÔ¼ö·Î ´Ý´Â´Ù. ´õ ÀÌ»ó »ç¿ëÇÏÁö ¾Ê´Â ¼ÒÄÏÀº ¹Ýµå½Ã ´Ý¾Æ ÁÖµµ·Ï ÇÑ´Ù.

2.10 winsock.dll ·Îµù

À©¼ÓÀ» ÀÌ¿ëÇϱâ À§Çؼ­´Â Ãʱâ winsock.dllÀ» ·Îµù ½ÃÄÑÁà¾ß ÇÑ´Ù. WSAStartupÇÔ¼ö·Î À©¼Ó dllÀ» ·ÎµùÇÒ ¼ö ÀÖ´Ù. ´õ ÀÌ»ó À©¼ÓÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é, WSACleanupÇÔ¼ö·Î À©¼Ó dllÀ» Á¦°ÅÇÑ´Ù.

2.11 ¼­¹ö ÇÁ·Î±×·¥ È帧

ÀüÇüÀûÀÎ ¼­¹ö ÇÁ·Î±×·¥Àº socket()->bind()->listen()->accept() ÀÇ ¼ø¼­¸¦ µû¸¥´Ù.

2.12 Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ È帧

Ŭ¶óÀÌ¾ðÆ®´Â ºñ±³Àû ´Ü¼øÇؼ­ socket()->connect()ÀÇ ¼ø¼­¸¦ µû¸¥´Ù.

3 ¿¹Á¦

3.1 ¼­¹ö ¿¹Á¦

°£´ÜÇÑ echo ¼­¹ö ÇÁ·Î±×·¥ÀÌ´Ù. Ŭ¶óÀ̾ðÆ®ÀÇ ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¼­ Ãâ·ÂÇÑ ´ÙÀ½ ¼ÒÄÏÀ» ´Ý´À´Ù.
#include <winsock.h>  
#include <stdio.h>  
  
#define MAX_PACKETLEN 512  
#define PORT 5552  
  
int main()  
{  
    WSADATA wsaData;  
    int status;  
    int SockLen;  
    int Readn,Writen;  
    SOCKET EndpointSocket, ClientSocket;  
    struct sockaddr_in SockInfo, ClientSockInfo;  
    char ReadBuffer[MAX_PACKETLEN];  
  
  
    if(WSAStartup(MAKEWORD(2,2),&wsaData)!= 0)  
    {  
        printf("error\r\n");  
        return 0;  
    }  
  
    EndpointSocket = socket( AF_INET, SOCK_STREAM, 0 );  
    if( EndpointSocket == INVALID_SOCKET )  
        return 1;  
  
    printf("Success socket create\r\n");  
    ZeroMemory(&SockInfo, sizeof( struct sockaddr_in ));  
  
    SockInfo.sin_family = AF_INET;  
    SockInfo.sin_port = htons( PORT );  
    SockInfo.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
  
    status = bind( EndpointSocket, (struct sockaddr*)&SockInfo, sizeof( struct sockaddr_in) );  
    if( status == SOCKET_ERROR)   
    {  
        printf("Bind Error\n");  
        return 0;  
    }  
    if( SOCKET_ERROR == listen( EndpointSocket, 5 ))  
    {  
        printf("listen Error\n");  
        return 0;  
    }  
  
    while(1)  
    {  
        ZeroMemory( &ClientSockInfo, sizeof( struct sockaddr_in ) );  
        SockLen = sizeof(struct sockaddr_in);  
        ClientSocket = accept( EndpointSocket, (struct sockaddr*)&ClientSockInfo, &SockLen );  
        if(ClientSocket == INVALID_SOCKET)  
        {  
            printf("Accept Error\n");  
            closesocket(EndpointSocket);  
            WSACleanup();  
            return 1;  
        }  
        printf("Accept Client\n");  
        Readn = recv( ClientSocket, ReadBuffer, MAX_PACKETLEN,0 );  
        if( Readn > 0 )  
        {  
            Writen = send( ClientSocket, ReadBuffer, Readn, 0 );  
        }  
        else  
        {  
            printf("read Error\n");  
        }  
        closesocket(ClientSocket);   
    }  
    closesocket( EndpointSocket );   
    WSACleanup();  
    return 0;  
  
}  
 

3.2 Ŭ¶óÀÌ¾ðÆ® ¿¹Á¦

echo Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥. POSIX ÇÔ¼ö·Î µµ¹èÇß´Ù.
#include <stdio.h> 
#include <winsock2.h> 
 
#define PORT_NUM 3800 
#define MAXLEN 1024 
 
int main(int argc, char **argv) 
{ 
    SOCKET sockfd; 
    WSADATA wsaData; 
    struct sockaddr_in addr; 
 
    char buf[MAXLEN]; 
    char rbuf[MAXLEN]; 
 
    if(argc !=2) 
    { 
        printf("Usage : %s [ip address]\n", argv[0]); 
        return 1; 
    } 
 
    if(WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) 
    { 
        return 1; 
    } 
 
    if((sockfd = socket(AF_INET,SOCK_STREAM, 0)) == INVALID_SOCKET)  
    { 
        return 1; 
    } 
    memset((void *)&addr, 0x00, sizeof(addr)); 
    addr.sin_family = AF_INET; 
    addr.sin_addr.s_addr = inet_addr(argv[1]); 
    addr.sin_port = htons(PORT_NUM); 
 
    if(connect(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR) 
    { 
        return 1; 
    } 
    while(1) 
    { 
         printf("> "); 
         fgets(buf, MAXLEN-1, stdin); 
         if(strncmp(buf, "quit\n",5) == 0) 
         { 
              break; 
         } 
 
         send(sockfd, (void *)buf, strlen(buf), 0); 
         memset(rbuf, 0x00, MAXLEN); 
           recv(sockfd, (void *)buf, MAXLEN, 0); 
         printf("s -> %s\n", buf); 
    } 
    closesocket(sockfd); 
    WSACleanup(); 
    return 0; 
} 
 

4 À©¼Ó È®Àå ÇÔ¼ö

À©µµ´Â À¯´Ð½º¿Í ´Ù¸¥ öÇÐÀ» °¡Áö°í ¸¸µé¾î Á³´Ù. Á¤Ä¡ÀûÀÎ ÀÌÀ¯ÀÏ ¼öµµ ÀÖ°í ´Ù¸¥ ±â¼úÀûÀÎ ÀÌÀ¯°¡ À־ ÀÏ ¼öµµ ÀÖÁö¸¸ »ç¿ëÇÏ´Â ±â¼úÀÇ Çü½Ä ¶ÇÇÑ ¸¹ÀÌ ´Ù¸£´Ù. BSD ¼ÒÄÏÀº À¯´Ð½º öÇÐÀ» µû¸£°í ÀÖÀ¸¸ç, Ư¼º»ó ¿î¿µÃ¼Á¦¿¡ ±íÀÌ °ü·ÃµÇ¾î ÀÖ´Ù. ±×·¯´Ùº¸´Ï BSD ¼ÒÄÏ ÀÎÅÍÆäÀ̽º´Â À©µµ¿¡ ¸ÂÁö ¾Ê´Â °æÇâÀÌ ÀÖ´Ù. ±×·¸´Ù°í BSD ¼ÒÄÏ ÀÎÅÍÆäÀ̽º Áö¿øÀ» Æ÷±âÇÒ ¼ö´Â ¾ø´Â ÀÏÀÌ´Ù. ¹ö¸®±â¿£ ¸®½ºÅ©°¡ ³Ê¹« Å©±â ¶§¹®ÀÌ´Ù. (½ÇÁ¦ À©µµ´Â ¸î¸î POSX ÀÎÅÍÆäÀ̽º´Â ÁöŰÁö ¾Ê°Ú´Ù°í ¼±¾ðÇϰí ÀÖ´Ù.)

ÇØ¼­ BSD ¼ÒÄÏ ÀÎÅÍÆäÀ̽º´Â ±×´ë·Î µÎ°í, À©¼Ó È®Àå ÇÔ¼öµéÀ» ¸¸µé¾ú´Ù. À̵é È®Àå ÇÔ¼ö´Â ±âÁ¸ BSD ¼ÒÄÏÀ̸§ÀǾտ¡ "WSA"¸¦ Á¢µÎ»ç·Î Çϰí ÀÖ´Ù. socket -> WSASocket, send -> WSASend, recv -> WSARecv ´ë·« ÀÌ·± ½ÄÀÌ´Ù.

À©¼Ó È®ÀåÇÔ¼öµµ (¼ÒÄÏ ÁöÁ¤ ¹øÈ£)SOCKET¸¦ ÀÌ¿ëÇØ¼­ ÀÛ¾÷À» ÇÑ´Ù. ±×·¯¹Ç·Î ¿ø·ÐÀûÀ¸·Î BSD ¼ÒÄÏ ÇÔ¼ö¿Í ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù. WSA °è¿­ ÇÔ¼ö¿Í BSD °è¿­ ÇÔ¼ö¸¦ ¼¯¾î¾²´Â°É Áö¾çÇØ¾ß ÇÑ´Ù´Â Àǰߵµ ÀÖÁö¸¸, ±×´ÙÁö ½Å°æÀ» ¾²Áö´Â ¾Ê´Â °Í °°´Ù.

À©¼Ó È®Àå ÇÔ¼ö´Â À©µµÀÇ ÀÔÃâ·Â ó¸® ±â¼úÀÎ Áßø ÀÔÃâ·Â ¸ðµ¨À» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.

4.1 Áßø ÀÔÃâ·Â ¸ðµ¨

Áßø ÀÔÃâ·Â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö Âü°í

4.2 ºñµ¿±â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ¸ðµ¨

ºñµ¿±â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö Âü°í


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