ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 À©¼Ó¿¡ ´ëÇØ¼
À©¼Ó(winsock)Àº windows Socket APIÀÇ ÁÙÀÓ¸»·Î, À©µµ ¿î¿µÃ¼Á¦ ±â¹ÝÀÇ ³×Æ®¿öÅ© ÇÁ·Î±×·¥À» °³¹ßÇϱâ À§ÇÑ ±â¼ú¿ä¼ÒµéÀÌ Àû¿ëµÈ °³¹ß µµ±¸´Ù. BSD socket¸¦ ±â¹ÝÀ¸·Î Çϰí ÀÖ¾î¼, ¸®´ª½ºÈ¯°æ¿¡¼ ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö °æÇèÀÌ ÀÖ´Ù¸é ¾î·ÆÁö ¾Ê°Ô ÀûÀÀÇÒ ¼ö ÀÖ´Ù. ´ëºÎºÐÀÇ ¼ÒÄÏ ÇÔ¼öµµ ±×´ë·Î »ç¿ëÇÑ´Ù. 1.1 BSD Socket¿ÍÀÇ ¸î °¡Áö Â÷ÀÌÁ¡
BSD Socket APIÀÇ °ÅÀÇ ÀüºÎ¸¦ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ´ÙÀ½°ú °°Àº ¸î °¡Áö Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù.
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 ºñµ¿±â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö ¸ðµ¨ |
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|