ÇöÀç°­Á : Winsock ÇÁ·Î±×·¡¹Ö ÀÌÀü: 5.1 À©¼ÓÀÇ ÀÌÇØ ´ÙÀ½: 5.3 À©¼Ó äÆà ¼­¹ö


5.2 À©¼ÓÀÇ µ¿ÀÛ

¢º À©¼Ó °ü·Ã ÇÔ¼öµéÀÇ »ç¿ë¹ý Áï, ÇÔ¼öÈ£Ãâ ¼ø¼­¿Í ÇÔ¼öÀÇ ÀÎÀÚ ¹× °á°ú ¸®ÅÏ°ª µîÀº 2Àå¿¡¼­ ¼Ò°³ÇÑ BSD ¼ÒÄÏÀÇ »ç¿ë¹ý°ú °ÅÀÇ °°´Ù.

¢º À©¼Ó ÇÁ·Î±×·¥À» ÀÛ¼ºÇϱâ À§ÇÏ¿©´Â À©µµ¿ì ÇÁ·Î±×·¡¹Ö°ú c ¾ð¾î¿¡ ´ëÇÑ Áö½ÄÀ» ÇÊ¿ä·Î Çϳª ÀÌ Ã¥¿¡¼­´Â ÀÌ¿¡ ´ëÇØ ÀÚ¼¼ÇÑ ¼³¸íÀ» ÇÏÁö ¾Ê°í ¿¹Á¦ ÇÁ·Î±×·¥À» ÀÌÇØÇϴµ¥ ÇÊ¿äÇÑ ±âº»ÀûÀÎ ³»¿ë¸¸ ¼³¸íÇÏ°Ú´Ù.

¢º ¼ÒÄÏÀÇ ±âº» °³³ä¿¡ °üÇÏ¿©´Â 2ÀåÀ» ¸ÕÀú Âü°íÇϱ⠹ٶõ´Ù.

5.2.1 ±âº»ÀûÀÎ À©¼Ó ÇÔ¼ö

(1) socket()

¢º À©¼Ó¿¡¼­µµ BSD ¼ÒÄÏ ÇÁ·Î±×·¥¿¡¼­¿Í °°ÀÌ socket() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Åë½ÅÀÇ Ã¢±¸ ¿ªÇÒÀ» ÇÏ´Â ¼ÒÄÏÀ» »ý¼ºÇÑ´Ù.

¢º ¾Æ·¡´Â socket()ÀÇ »ç¿ë ¿¹·Î ÀÎÅÍ³Ý µµ¸ÞÀÎÀÇ ÁÖ¼Ò Ã¼°è¿¡¼­ ½ºÆ®¸²Çü ¼ÒÄÏÀ» °³¼³ÇÏ´Â °ÍÀ» º¸¿´´Ù.

SOCKET s; /* SOCKETÀº int ŸÀÔÀÌ´Ù */

char lpszMsg[100];

s = socket(AF_INET, SOCK_STREAM, 0);

if (s == INVALID_SOCKET) { /* ¼ÒÄÏ °³¼³ ¿¡·¯ ¹ß»ý */

wsprintf(lpszMsg, "socket() ¿¡·¯¹øÈ£ : %d", WSAGetLastError());

MessageBox(hwnd, lpszMsg, "¿¡·¯", MB_OK);

}

¢º socket() ÇÔ¼öÀÇ Ã¹¹ø° ÀÎÀÚ´Â ¼ÒÄÏÀÌ »ç¿ëÇÒ ÁÖ¼Ò Ã¼°è(Address Family)ÀÇ Á¾·ù¸¦ ÁöÁ¤ÇÑ´Ù.

¢º À©¼Ó ¹öÀü 1.1¿¡¼­´Â ÀÎÅÍ³Ý ÁÖ¼Òü°è(AF_INET)¸¸À» Áö¿øÇÑ´Ù.

¢º µÎ¹ø° ÀÎÀÚ´Â Æ®·£½ºÆ÷Æ® ÇÁ·ÎÅäÄÝÀ» ÁöÁ¤Çϴµ¥ ¿¬°áÇüÀÎ ½ºÆ®¸² ¼ÒÄÏÀ» °³¼³ÇÏ·Á¸é SOCK_STREAMÀ», ºñ¿¬°áÇüÀÎ µ¥ÀÌÅͱ׷¥ ÇüÅÂÀÇ ¼ÒÄÏÀ» °³¼³ÇÏ·Á¸é SOCK_ DGRAMÀ» ¼±ÅÃÇÑ´Ù.

¢º ¼¼¹ø° ÀÎÀÚ´Â ÇÁ·ÎÅäÄÝ Å¸ÀÔ(Type)Àε¥ ÀϹÝÀûÀ¸·Î 0À» ¾´´Ù.

¢ºsocket()ÀÇ ¼öÇàÀÌ ¼º°øÇÑ °æ¿ì¿¡´Â »õ·Î¿î ¼ÒÄϹøÈ£¸¦ ¸®ÅÏÇÏ°í, ½ÇÆÐÇÑ °æ¿ì¿¡´Â INVALID_SOCKETÀÌ ¸®ÅϵȴÙ.

¢º À§¿¡¼­ WSAGetLastError()´Â °¡Àå ÃÖ±Ù¿¡ ¹ß»ýÇÑ À©¼Ó °ü·Ã ÇÔ¼öÀÇ ¿¡·¯Äڵ带 ¸®ÅÏÇÏ´Â ÇÔ¼öÀÌ´Ù

¢º MessageBox()´Â ¸Þ½ÃÁö »óÀÚ¸¦ ¸¸µé¾î È­¸é¿¡ Ãâ·ÂÇÏ´Â À©µµ¿ì ÇÔ¼öÀÌ´Ù.

¢º MessageBox()ÀÇ ¿øÇüÀº ´ÙÀ½°ú °°À¸¸ç À§¿¡¼­´Â ¿¡·¯ ¸Þ½ÃÁö¿Í OK ¹öÆ°À» Ãâ·ÂÇÏ°í ÀÖ´Ù.

int MessageBox (

HWND hWnd, /* À©µµ¿ì ÇÚµé */

LPCTSTR lpText, /* ÅؽºÆ® ¹è¿­ ÁÖ¼Ò */

LPCTSTR lpCaption, /* ĸ¼Ç ¹è¿­ ÁÖ¼Ò */

UINT uType); /* ¹Ú½º ½ºÅ¸ÀÏ */

¢º À§¿¡¼­ HWND´Â À©µµ¿ì ÇÚµé ŸÀÔÀ» ³ªÅ¸³»´Âµ¥ ½ÇÁ¦·Î´Â int ŸÀÔÀÌ´Ù.

¢º LPCTSTRÀº long pointer const char string ŸÀÔÀ» ³ªÅ¸³»°í, UINT´Â unsigned int ŸÀÔÀ» ³ªÅ¸³½´Ù.

(2) bind()

¢º bind()´Â ¼­¹ö¿¡¼­ È£ÃâµÇ´Âµ¥ socket()ÀÇ ¼öÇàÀ¸·Î »ý¼ºµÈ ¼ÒÄÏÀÇ ¹øÈ£(s)¿Í ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼(SOCKADDR_IN)¸¦ ¿¬°áÇϱâ À§ÇØ È£ÃâÇÑ´Ù.

¢º bind()ÀÇ Ã¹¹ø° ÀÎÀڷδ ¼ÒÄϹøÈ£¸¦, µÎ¹ø° ÀÎÀÚ´Â ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ÀÇ ÁÖ¼Ò¸¦ ¾²°í ¼¼¹ø° ÀÎÀÚ´Â ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ¾´´Ù.

¢º ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ SOCKADDRÀº BSD ¼ÒÄÏ¿¡¼­¿Í °°Àº ÇüŸ¦ °¡Áø´Ù(2.1.4Àý ÂüÁ¶).

¢º ¾Æ·¡´Â ÀÎÅÍ³Ý Àü¿ëÀ¸·Î Á¤ÀÇµÈ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ SOCK- ADDR_INÀ» º¸¿©ÁÖ°í ÀÖ´Ù.

struct SOCKADDR_IN {

short sin_family; /* ÁÖ¼Ò Ã¼°è */

u_short sin_port; /* Æ÷Æ®¹øÈ£ */

struct in_addr sin_addr; /* ÀÎÅÍ³Ý ÁÖ¼Ò (4¹ÙÀÌÆ®) */

char sin_zero[8]; /* ÃÑ 16¹ÙÀÌÆ®¸¦ ¸ÂÃß±â À§ÇÑ ¿©¹é */

}

struct in_addr {

u_long s_addr; /* 32ºñÆ®ÀÇ IP ÁÖ¼Ò¸¦ ÀúÀåÇÒ ±¸Á¶Ã¼ */

};

¢º ¾Æ·¡ ÇÁ·Î±×·¥ ÄÚµå´Â bind() ÇÔ¼öÀÇ »ç¿ë ¿¹Àε¥ Æ÷Æ®¹øÈ£·Î 3000¹øÀ» ÁöÁ¤ÇÏ°í ÀÖ´Ù.

#define PORT_NO 3000

SOCKET s;

char lpszMsg[100];

SOCKADDR_IN m_addr; /* ÀÎÅÍ³Ý Å¸ÀÔÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */

/* ¼ÒÄÏ °³¼³ */

s = socket(AF_INET, SOCK_STREAM, 0);

/* ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ÀÇ °ªÀ» ÁöÁ¤ */

m_addr.sin_family = AF_INET;

m_addr.sin_addr.s_addr = htonl(INADDR_ANY);

m_addr.sin_port = htons(PORT_NO);

bind(s, (LPSOCKADDR)&m_addr, sizeof(m_addr));

¢º À§¿¡¼­ SOCKADDR_IN°ú LPSOCKADDRÀº °¢°¢ ÀÎÅÍ³Ý Å¸ÀÔÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¿Í ÀϹÝÀûÀÎ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¸¦ ³ªÅ¸³Â´Ù.

¢º bind() ÇÔ¼ö´Â ¿ø·¡ LPSOCKADDR ŸÀÔÀÇ ÀÎÀÚ¸¦ »ç¿ëÇϵµ·Ï Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î SOCKADDR_IN ŸÀÔÀÇ º¯¼öÀÎ m_addrÀ» bind()¸¦ È£ÃâÇϱâ Àü¿¡ LPSOCKADDR ŸÀÔÀ¸·Î castingÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.

¢º ±×·¯³ª óÀ½ºÎÅÍ LPSOCKADDR ŸÀÔÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¸¦ »ç¿ëÇÏÁö ¾ÊÀº ÀÌÀ¯´Â SOCKADDR_IN ŸÀÔÀÌ IP ÁÖ¼Ò¿Í Æ÷Æ®¹øÈ£ °ªÀ» ÁöÁ¤Çϱ⿡ Æí¸®Çϱ⠶§¹®ÀÌ´Ù.

¢º À§¿¡¼­ htonl()¿Í htons()´Â ÄÄÇ»ÅÍ ³»ºÎ¿¡¼­ »ç¿ëÇÏ´Â ¹ÙÀÌÆ® ¼ø¼­(È£½ºÆ® ¹ÙÀÌÆ® ¼ø¼­)¸¦ ³×Æ®¿÷ ¹ÙÀÌÆ® ¼ø¼­(µ¥ÀÌÅÍÀÇ ¹ÙÀÌÆ® ´ÜÀ§ Àü¼Û ¼ø¼­)·Î ¹Ù²Ù´Â ÇÔ¼öµé·Î ÀÚ¼¼ÇÑ ³»¿ëÀº 2.2.1ÀýÀ» ÂüÁ¶Çϱ⠹ٶõ´Ù.

(3) listen()

¢º listen()Àº ¿¬°áÇü(TCP) ¼ÒÄÏÀ» °³¼³ÇÑ ¼­¹ö¿¡¼­ È£ÃâÇϴµ¥, ÁöÁ¤µÈ ¼ÒÄÏÀ» ÅëÇÏ¿© µé¾î¿À´Â Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍÀÇ ¿¬°á¿äûÀ» ±â´Ù¸®´Â ÇÔ¼öÀÌ´Ù.

¢º listen()ÀÇ Ã¹¹ø° ÀÎÀÚ´Â ¼ÒÄϹøÈ£ÀÌ°í, µÎ¹ø° ÀÎÀÚ¿¡´Â ¿¬°áÀ» ´ë±â½Ãų ¼ö Àִ Ŭ¶óÀ̾ðÆ®ÀÇ ÃÖ´ë¼ö¸¦ ÁöÁ¤ÇÑ´Ù.

¢º listen()ÀÌ ¼º°øÀûÀ¸·Î ¼öÇàµÈ °æ¿ì¿¡´Â 0À» ¸®ÅÏÇϸç, ½ÇÆÐÇÑ °æ¿ì¿¡´Â SOCKET_ERROR¸¦ ¸®ÅÏÇÑ´Ù.

¢º ´ÙÀ½Àº listen()ÀÇ »ç¿ë ¿¹ÀÌ´Ù.

listen(s, 5);

(4) accept()

¢º accept()´Â ¿¬°áÇü ¼­¹ö¿¡¼­ listen()À» ½ÇÇàÇÏ¿© ¼öµ¿ ´ë±â¸ðµå·Î ¿¬°á¿äûÀ» ±â´Ù¸®´Ù°¡ Ŭ¶óÀ̾ðÆ®¿¡¼­ ¼­¹ö·Î ¿¬°á¿äûÀ» º¸³»¿À¸é À̸¦ ¼ö¶ôÇϱâ À§ÇÏ¿©, ¼­¹ö°¡ È£ÃâÇØ µÎ´Â ÇÔ¼öÀÌ´Ù.

¢º accept()ÀÇ ¼öÇàÀÌ ¼º°øÇÑ °æ¿ì¿¡´Â ¼ÒÄÏÀÌ Çϳª »õ·Î ¸¸µé¾îÁö¸ç »õ·Î ¸¸µé¾îÁø ¼ÒÄϹøÈ£°¡ ¸®ÅϵȴÙ.

¢º ¶ÇÇÑ À̶§ Á¢¼ÓµÈ Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ¿Í ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ÀÇ ±æÀÌ´Â accept() ÇÔ¼ö ÀÎÀÚ¸¦ ÅëÇÏ¿© ¾Ë·ÁÁØ´Ù.

¢º ´ÙÀ½Àº accept()ÀÇ »ç¿ë ¿¹Àε¥ accpet()°¡ ¼º°øÀûÀ¸·Î ¸®ÅÏµÇ¸é ¿¬°áµÈ Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏÁÖ¼Ò°¡ ±¸Á¶Ã¼ m_client Addr¿¡ ½Ç·ÁÀÖ°Ô µÈ´Ù.

SOCKET s; /* ¼­¹ö°¡ °³¼³ÇÑ ¼ÒÄϹøÈ£ */

SOCKET client_s; /* accept()°¡ ¸®ÅÏÇÒ »õ·Î¿î ¼ÒÄϹøÈ£ */

char lpszMsg[100]; /* ¸Þ½ÃÁö ¹Ú½º¿¡ Ãâ·ÂÇÒ ¸Þ½ÃÁö */

SOCKADDR_IN m_addr; /* ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */

SOCKADDR_IN m_clientAddr; /* Á¢¼ÓµÈ Ŭ¶óÀ̾ðÆ®ÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */

client_s = accept(s, (LPSOCKADDR)&m_clientAddr, &m_nClientAddrLen);

if (client_s == INVALID_SOCKET) {

wsprintf(lpszMsg, "accept() ¿¡·¯ ¹øÈ£: %d", WSAGetLastError());

MessageBox(hwnd, lpszMsg, "¿¡·¯", MB_OK);

} else {

wsprintf(lpszMsg, "client IP: %s",inet_ntoa(m_clientAddr.sin_addr.s_addr)); MessageBox(hwnd, lpszMsg, "¿¡·¯", MB_OK);

}

(5) connect()

¢º ¿¬°áÇü ¼ÒÄÏÀ» °³¼³ÇÑ Å¬¶óÀ̾ðÆ®°¡ ¼­¹ö¿Í Åë½ÅÀ» ÇÏ·Á¸é ¸ÕÀú ¼­¹ö¿Í ¿¬°áµÇ¾î¾ß Çϴµ¥ À̸¦ À§ÇÏ¿© Ŭ¶óÀ̾ðÆ®°¡ È£ÃâÇÏ´Â ÇÔ¼ö°¡ connect()ÀÌ´Ù.

¢º ÀÌ·¯ÇÑ Å¬¶óÀ̾ðÆ®ÀÇ connect() È£Ãâ¿¡ ´ëÇØ, ¼­¹ö°¡ ¹Ì¸® È£ÃâÇØ µÐ accept()°¡ Á¤»óÀûÀ¸·Î ó¸®µÇ¾î ¿¬°áÀÌ ¿Ï·áµÇ¸é connect()´Â 0À» ¸®ÅÏÇÑ´Ù.

¢º ´ÙÀ½Àº connect()ÀÇ »ç¿ë ¿¹ÀÌ´Ù.

#define SERVER_PORT_NO 3001

#define SERVER_IP_ADDR "203.252.65.3"

SOCKET s;

SOCKADDR_IN m_addr; /* ¿¬°áÇÒ ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */

char lpszMsg[100];

/* Ŭ¶óÀ̾ðÆ®°¡ ¿¬°áÇÏ·Á°í ÇÏ´Â ¼­¹öÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼¸¦ ¸¸µç´Ù */

m_addr.sin_family = AF_INET;

m_addr.sin_port = htons(SERVER_PORT_NO);

m_addr.sin_addr.s_addr = inet_addr(SERVER_IP_ADDR);

connect(s, (LPSOCKADDR)&m_addr, sizeof(m_addr));

(6) closesocket()

¢º ¼ÒÄÏÀÇ »ç¿ëÀÌ ³¡³­ ÈÄ ¼ÒÄÏÀ» ´Ý±â À§ÇØ È£ÃâÇϸç BSDÀÇ close()¿Í °°Àº µ¿ÀÛÀ» ÇÑ´Ù.

¢º closesocket()À» È£ÃâÇÏ¸é ¾ÆÁ÷ 󸮵ÇÁö ¾ÊÀº µ¥ÀÌÅ͵é, Áï ¼Û½Å ¹öÆÛ¿¡ µé¾î ÀÖÀ¸³ª ¾ÆÁ÷ ¸ñÀûÁö·Î Àü¼ÛµÇÁö ¾ÊÀº ÆÐŶ ¶Ç´Â ¼ö½Å ¹öÆÛ¿¡ µµÂøÇØ ÀÖÀ¸³ª ¾ÆÁ÷ À©¼ÓÀÌ ÀоîµéÀÌÁö ¾ÊÀº ÆÐŶµéÀÌ ¸ðµÎ ó¸®µÈ ÈÄ¿¡ ½ÇÁ¦·Î ¼ÒÄÏÀÌ Á¾·áµÈ´Ù.

¢º ±×·¯³ª ÀÌµé ¹Ìó¸® ÆÐŶµéÀ» ¹Ù·Î ¹ö¸®°Å³ª, Á¤ÇØÁø ½Ã°£±îÁö¸¸ 󸮵DZ⸦ ±â´Ù¸®·Á¸é setsockopt()À» È£ÃâÇÏ¿© ¼ÒÄÏÀÇ ¿É¼ÇÀ» ¹Ù²Ù¾î µÎ¾î¾ß ÇÑ´Ù(´ÙÀ½ Ç׸ñÀÇ setsockopt() ÂüÁ¶).

(7) setsockopt()

¢º °³¼³µÈ ¼ÒÄÏÀÇ µ¿ÀÛ¿¡ °üÇÑ °¢Á¾ ¿É¼ÇÀ» ÁöÁ¤ÇÏ´Â µ¥ »ç¿ëµÈ´Ù. setsockopt()ÀÇ »ç¿ë ¹®¹ýÀº ´ÙÀ½°ú °°´Ù.

¢º setsockopt()Àº ¼Û¼ö½Å ¹öÆÛÀÇ Å©±â ÁöÁ¤, OOB(Out of band) µ¥ÀÌÅÍ Ã³¸® ¹æ¹ý, ¹æ¼ÛÇü ¸Þ½ÃÁöÀÇ Àü¼Û Çã¿ë µî ¿©·¯ °¡Áö ¼ÒÄÏ ¿É¼Ç ÁöÁ¤¿¡ »ç¿ëµÉ ¼ö ÀÖ´Ù.

¢º ÁÖ·Î »ç¿ëµÇ´Â optnameÀ¸·Î´Â, ¸ÕÀú ¼ÒÄÏ Á¾·á½Ã ¾ÆÁ÷ ¼Û¼ö½ÅÀÌ ¿Ï·áµÇÁö ¾ÊÀº ÆÐŶµéÀÇ Ã³¸® ¹æ¾ÈÀ» ÁöÁ¤Çϰųª(SO_LINGER), ¼ÒÄÏÀÇ µð¹ö±× Á¤º¸¸¦ Ãâ·ÂÇϵµ·Ï ÁöÁ¤Çϰųª(SO_DEBUG), ÇØ´ç ¼ÒÄÏ¿¡¼­ ¹æ¼ÛÇü ¸Þ½ÃÁö¸¦ Àü¼ÛÇÏ´Â °ÍÀ» Çã¿ëÇÏ´Â °Í(SO_ BROADCAST) µîÀÌ´Ù.

¢º SO_LINGER ¿É¼ÇÀº closesocket() È£Ãâ½Ã Àü¼Û ½Ã½ºÅÛ(TCP/IP) ³»ºÎ¿¡ ³²¾Æ ÀÖ´Â ¹ÌÀü¼Û ÆÐŶ ¶Ç´Â ¾ÆÁ÷ ¼ö½Å 󸮵ÇÁö ¾ÊÀº ÆÐŶµéÀÇ Ã³¸® ¹æ¾ÈÀ» ¹Ì¸® ÁöÁ¤ÇÏ´Â °ÍÀ¸·Î À̶§ optvalÀº ´ÙÀ½°ú °°Àº ±¸Á¶Ã¼ lingerÀÇ ÁÖ¼Ò¸¦ °¡¸®Å°µµ·Ï ÇÑ´Ù.

struct linger {

int l_onoff; /* LINGER ¸ðµåÀÇ ¼±ÅÃ/Ãë¼Ò */

int l_linger; /* LINGER ½Ã°£ */

};

¢º ¿¹¸¦µé¾î ¹Ìó¸®µÈ ÆÐŶµéÀ» ¹Ù·Î ¹ö¸®Áö ¾Ê°í ÁöÁ¤µÈ ½Ã°£³»¿¡ 󸮵DZ⸦ ±â´Ù¸®·Á¸é(Áï, LINGER¸¦ ¼±ÅÃÇÏ·Á¸é) l_onoff¸¦ 1·Î ¼¼Æ®ÇÏ°í l_linger¿¡ ó¸® À¯¿¹½Ã°£À» ÃÊ´ÜÀ§·Î ÁöÁ¤ÇØ ÁØ´Ù.

¢º LINGER¸¦ ¼±ÅÃÇÏÁö ¾ÊÀ¸·Á¸é Áï, ¹Ìó¸®µÈ ÆÐŶµéÀ» closesocket() È£Ãâ½Ã Áï½Ã ¹ö¸®µµ·Ï ÇÏ·Á¸é l_onoff¸¦ 0À¸·Î ÇÏ°í SO_DONTLINGER ¿É¼ÇÀ» ¼±ÅÃÇÏ¿© setsockopt()À» È£ÃâÇÏ¸é µÈ´Ù.

¢º ÇÑÆí ¼ÒÄÏÀÌ Ã³À½ ¸¸µé¾îÁö¸é ÈÄÀÚÀÇ »óÅÂÀÎ DONT- LINGER »óÅ·ΠµÇ¾î ÀÖ´Ù.

5.2.2 ºñµ¿±â ¸ðµåÀÇ »ç¿ë

¢º À©µµ¿ì(ƯÈ÷ 3.1¹öÀü)´Â ¸ÖƼŽºÅ·ÀÌ Áö¿øµÇÁö ¾Ê´Â ¿î¿µÃ¼Á¦À̹ǷΠ¾î¶² ÇÔ¼ö È£ÃâÀÌ ºí·ÏµÇ¾î ÀÖÀ¸¸é ½Ã½ºÅÛ Àüü°¡ ¸ØÃß¾î ÀÖ°Ô µÈ´Ù.

¢º À©¼Ó¿¡¼­ °³¼³ÇÑ ¼ÒÄÏÀº ±âº»ÀûÀ¸·Î blocking ¸ðµå·Î µ¿ÀÛÇϴµ¥ ¿¹¸¦µé¾î accept()¸¦ È£ÃâÇÏ¿´À» ¶§ Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ ¿ä±¸µÈ connect()°¡ ¾ø´Ù¸é ¼­¹ö´Â ºí·ÏµÈ´Ù.

¢º À̸¦ ÇØ°áÇϱâ À§ÇÏ¿© ¼ÒÄÏÀ» ºñµ¿±â ¸ðµå·Î ¹Ù²Ù´Â °ÍÀÌ ÇÊ¿äÇѵ¥ À̸¦ À§ÇÏ¿© WSAAsyncSelect()¸¦ »ç¿ëÇÑ´Ù.

¢º WSAAsyncSelect()¸¦ È£ÃâÇÔÀ¸·Î½á ¼ÒÄÏÀº ÀÚµ¿À¸·Î ºñµ¿±â ¸ðµå·Î ¹Ù²î°í ºí·ÏµÉ ¼ö ÀÖ´Â ÇÔ¼öµé(accept(), send(), recv() µî)À» ºñµ¿±â ¸ðµå·Î ó¸®ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.

¢º ¾Æ·¡´Â WSAAsyncSelect()ÀÇ »ç¿ë ¹®¹ýÀÌ´Ù.

int WSAAsyncSelect (

SOCKET s, /* »óź¯È­(À̺¥Æ®)¸¦ °¨ÁöÇÒ ¼ÒÄϹøÈ£ */

HWND hWnd, /* ¼ÒÄÏ s¿¡¼­ À̺¥Æ®°¡ ¹ß»ýÇßÀ» ¶§

¸Þ½ÃÁö¸¦ ¹ÞÀ» À©µµ¿ì ÇÚµé */

UINT wMsg, /* À̺¥Æ® ¹ß»ý½Ã º¸³¾ ¸Þ½ÃÁö */

long lEvent); /* °ü½ÉÀ» °®´Â À̺¥Æ®¸¦ ±ÔÁ¤ÇÏ´Â bitmask */

¢º WSAAsyncSelect()´Â È£Ãâ Áï½Ã ¸®ÅÏµÇ¸ç ¿¡·¯¹ß»ý½Ã¿¡´Â SOCKET_ERROR¸¦ ¸®ÅÏÇÑ´Ù.

¢º ¿¡·¯°¡ ¹ß»ýÇÏ´Â °æ¿ì´Â Winsock.dllÀÌ ÃʱâÈ­µÇÁö ¾Ê¾Ò°Å³ª, ³×Æ®¿÷ÀÌ µ¿ÀÛÇÏÁö ¾Ê°Å³ª, ´Ù¸¥ blocking ÇÔ¼ö°¡ ó¸®ÁßÀ̰ųª, ÇÔ¼öÀÇ ÀÎÀÚ¸¦ À߸ø ÀÔ·ÂÇÑ °æ¿ìÀÌ´Ù.

¢º WSAAsyncSelect()°¡ ¿¡·¯¾øÀÌ ¸®ÅÏµÇ¸é ´ÙÀ½°ú °°Àº Á¶°ÇÀÌ ¸¸Á·µÈ °ÍÀÌ´Ù.

1) ¼ÒÄÏÀÌ ºñµ¿±â ¸ðµå·Î µÇ¾ú´Ù.

2) ¿øÇÏ´Â À̺¥Æ®°¡ ¹ß»ýÇÏ¸é ±× »ç½ÇÀÌ ¸Þ½ÃÁö·Î Àü´ÞµÉ °ÍÀÌ´Ù.

3) ÀÌ ¼ÒÄÏ¿¡ accept()°¡ È£ÃâµÇ¾î »õ·Î¿î ¼ÒÄÏÀÌ ¸¸µé¾îÁö¸é »õ·Î¿î ¼ÒÄÏ¿¡ ´ëÇؼ­µµ WSAAsyncSelect() È£Ãâ½Ã ¿ä±¸ÇÑ À̺¥Æ®¸¦ ¶È°°ÀÌ Ã³¸®ÇØ ÁØ´Ù.

¢º WSAAsyncSelect()¸¦ È£ÃâÇÏ¸é ¼ÒÄÏÀº ºñµ¿±â ¸ðµå·Î ¹Ù²î°í ¼ÒÄÏ¿¡¼­ ÁöÁ¤µÈ À̺¥Æ®°¡ ¹ß»ýÇÏ¸é ¸Þ½ÃÁö Àü´ÞÀ» ÅëÇÏ¿© ÀÌ »ç½ÇÀ» WSAAsyncSelect()¸¦ È£ÃâÇÑ ÀÀ¿ë ÇÁ·Î±×·¥¿¡°Ô ¾Ë¸®°Ô µÈ´Ù.

¢º ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­´Â °¢ À̺¥Æ®¿¡ ÇØ´çÇÏ´Â ±â´ÉÀ» ¼öÇàÇÏ¸é µÈ´Ù.

¢º À̺¥Æ®ÀÇ Á¾·ù¿¡´Â ¼ö½Å µ¥ÀÌÅÍÀÇ µµÂø, µ¥ÀÌÅ͸¦ ¼Û½ÅÇÒ Áغñ°¡ µÊ, ¿¬°á¿äûÀ» acceptÇÒ Áغñ°¡ µÊ µîÀÇ »ç°ÇµéÀÌ Àִµ¥, ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ °ü½ÉÀ» °®´Â À̺¥Æ® Áï, ¾Ë°í ½ÍÀº ¼ÒÄÏÀÇ »óź¯È­´Â WSAAsyncSelect()¸¦ È£ÃâÇÒ ¶§ lEvent ÀÎÀÚ¿¡ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

¢º ÇØ´ç ¼ÒÄÏ¿¡¼­, lEvent ÀÎÀÚ¿¡ ÁöÁ¤µÈ À̺¥Æ® Áß Çϳª¶óµµ ¹ß»ýÇϸé À©¼ÓÀº ÀÀ¿ë ÇÁ·Î±×·¥¿¡°Ô ÀÌ »ç½ÇÀ» ¾Ë·ÁÁÖ°Ô µÈ´Ù.

¢º À̺¥Æ®ÀÇ Á¾·ù´Â Ç¥ 5-3°ú °°´Ù.

À̺¥Æ®

ÀÇ ¹Ì

FD_READ ¼ö½ÅµÈ µ¥ÀÌÅÍ°¡ ÀÖÀ½
FD_WRITE µ¥ÀÌÅÍ ¼Û½ÅÀÌ °¡´ÉÇÔ(¼Û½Å ¹öÆÛ°¡ ºñ¾úÀ½)
FD_OOB Out of band µ¥ÀÌÅÍ°¡ ¼ö½ÅµÊ
FD_ACCEPT connect ¿äûÀÌ ÀÖ¾î accept 󸮰¡ °¡´ÉÇÔ (¼­¹ö¿¡¼­)
FD_CONNECT connect ¿äûÀÌ ¼º°øÀûÀ¸·Î ÀÌ·ç¾îÁü (Ŭ¶óÀ̾ðÆ®¿¡¼­)
FD_CLOSE ¼ÒÄÏ Á¾·á°¡ ÀÌ·ç¾îÁü

Ç¥ 5-3 WSAAsyncSelect()¿¡¼­ ´Ù·ç´Â À̺¥Æ® Á¾·ù

¢º Ç¥ 5-3¿¡¼­ FD_READ À̺¥Æ®´Â ÇØ´ç ¼ÒÄÏ¿¡ µ¥ÀÌÅÍ°¡ ¼ö½ÅµÇ¾î ÀÖÀ¸¸ç ÇöÀç À̸¦ ÀÐÀ» ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë¸®´Â ¸Þ½ÃÁöÀÌ´Ù.

¢º À̶§ ÀÀ¿ë ÇÁ·Î±×·¥Àº ¼ÒÄÏ Á¾·ù¿¡ µû¶ó(TCP¶Ç´Â UDP) recv() ¶Ç´Â recvfrom()À¸·Î µ¥ÀÌÅ͸¦ ÀÐÀ¸¸é µÈ´Ù.

¢º FD_WRITE´Â ¿¬°áÇü ¼ÒÄÏÀÌ »ó´ë¹æ ¼ÒÄÏ°ú óÀ½ ¿¬°áµÉ ¶§, Áï ¼­¹ö¿¡¼­´Â accept()°¡ ¼º°øÇϰųª Ŭ¶óÀ̾ðÆ®¿¡¼­´Â connect()°¡ ¼º°øÇÑ ¶§¿¡ óÀ½ ¹ß»ýÇÑ´Ù. ÀÌ ¶§ ÀÀ¿ë ÇÁ·Î±×·¥Àº send()¸¦ È£ÃâÇÏ¿© µ¥ÀÌÅ͸¦ ¼Û½ÅÇÒ ¼ö ÀÖ´Ù.

¢º µ¥ÀÌÅÍ°¡ ¼Û½Å¹öÆÛ¸¦ ¶°³ª ¼Û½Å¹öÆÛ°¡ ºñ°Ô µÇ¾îµµ FD_ WRITE°¡ ¹ß»ýÇϴµ¥, ÀÌ°ÍÀº ÀÌÁ¦ »õ·Î¿î ¼Û½ÅÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù.

¢º FD_ACCEPT´Â ¼­¹ö ¼ÒÄÏ¿¡¼­ ¹ß»ýÇϴµ¥, Ŭ¶óÀ̾ðÆ®°¡ connect()·Î ¿¬°á¿äûÀ» ÇØ¿ÔÀ¸¹Ç·Î ¼­¹ö°¡ accept()¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë·ÁÁØ´Ù. Áï, ÇØ´ç ¼ÒÄÏÀ¸·Î accept()¸¦ È£ÃâÇÒ ¼ö ÀÖÀ½À» ¾Ë·ÁÁØ´Ù.

¢º FD_CONNECT´Â Ŭ¶óÀ̾ðÆ®¿¡¼­ ¹ß»ýÇϴµ¥ connect() ½Ã½ºÅÛ ÄÝÀÌ ¼º°øÀûÀ¸·Î ÀÌ·ç¾îÁ³À» ¶§ ¹ß»ýÇÏ´Â À̺¥Æ®ÀÌ´Ù.

¢º ¼ö½ÅÃø¿¡ µµÂøÇÑ ¸ðµç ÆÐŶÀº ÀϹÝÀûÀ¸·Î µµÂøÇÑ ¼ø¼­´ë·Î ¹öÆÛ¿¡ ÀúÀåµÈ ÈÄ Â÷·Ê´ë·Î 󸮵ȴÙ.

¢º OOB µ¥ÀÌÅÍ´Â ÀÌ·¯ÇÑ ¼ø¼­¸¦ ¹«½ÃÇÏ°í ¿ì¼±ÀûÀ¸·Î 󸮵Ǿî¾ß ÇÒ µ¥ÀÌÅ͸¦ ¸»Çϸç À̸¦ ó¸®Çϱâ À§ÇÏ¿© OOB µ¥ÀÌÅÍ°¡ µµÂøÇϸé FD_OOB À̺¥Æ®°¡ ¹ß»ýÇÑ´Ù.

¢º OOB µ¥ÀÌÅÍ´Â 'Ctrl-C'°°Àº Á¦¾î ¹®ÀÚ¸¦ Àü´ÞÇϴµ¥ »ç¿ëµÈ´Ù.

¢º WSAAsyncSelect()´Â °¢ ¼ÒÄÏ¿¡ ´ëÇÏ¿© ÇÑ ¹ø¸¸ ºÎ¸£´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù. ¸¸¾à WSAAsyncSelect()¸¦ Áߺ¹ÇÏ¿© È£ÃâÇϸé ÀÌÀü¿¡ È£ÃâµÈ WSAAsyncSelect()ÀÇ °¢Á¾ ¿É¼ÇÀº ¹«½ÃµÇ¹Ç·Î ÁÖÀÇÇÏ¿©¾ß ÇÑ´Ù.

¢º ÀÌÀü¿¡ ÁöÁ¤ÇÑ WSAAsyncSelect() ¿É¼ÇÀ» Ãë¼ÒÇÏ¿© ¾î¶² À̺¥Æ® ¹ß»ý¿¡ ´ëÇÑ ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÏ°í ½ÍÁö ¾ÊÀ¸¸é wMsg=0, lEvent=0·Î ÇÏ¿© WSAAsyncSelect()¸¦ ´Ù½Ã È£ÃâÇÏ¸é µÈ´Ù.

¢º ¾Æ·¡´Â ¼ÒÄÏ m_s·Î Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó¿äû connect()°¡ Á¢¼öµÇ¾î FD_ACCEPT À̺¥Æ®°¡ ¹ß»ýÇÏ¸é »ç¿ëÀÚ ¸Þ½ÃÁö(WM_USER + 1)¸¦ º¸³»µµ·Ï ÇÏ´Â ¿¹ÀÌ´Ù.

WSAAsyncSelect(m_s, m_hWnd, WM_USER + 1, FD_ACCEPT);

¢º À̺¥Æ®¸¦ ó¸®ÇÏ´Â ÇÁ·Î±×·¥¿¡¼­´Â À̺¥Æ®ÀÇ Á¾·ù¸¦ ¾Ë±â À§ÇÏ¿© º¯¼ö lParam¸¦ ÂüÁ¶ÇÏ¿©¾ß Çϴµ¥ lParamÀÇ ÇÏÀ§ 16ºñÆ®¿¡´Â ¹ß»ýÇÑ À̺¥Æ®ÀÇ Á¾·ù°¡ ½Ç·ÁÀÖ°í »óÀ§ 16ºñÆ®¿¡´Â ¿¡·¯Äڵ尡 ½Ç·ÁÀÖ´Ù.

¢º ÀÌ·¯ÇÑ À̺¥Æ® Á¾·ù¿Í ¿¡·¯Äڵ带 lParam¿¡¼­ Æí¸®ÇÏ°Ô Ã£¾Æ³»±â À§ÇÏ¿© ¸ÅÅ©·Î WSAGETSELECTEVENT()¿Í WSA- GETSELECTERROR()°¡ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

#define WSAGETSELECTEVENT(lParam) LOWORD(lParam)

#define WSAGETSELECTERROR(lParam) HIWORD(lParam)

¢º ¾Æ·¡ÀÇ ÄÚµå´Â ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ ¹ß»ýÇÑ À̺¥Æ®°¡ FD_ACCEPTÀÎÁö¸¦ Áï, Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ ¿¬°á¿äûÀÌ ¿Í¼­ À̺¥Æ®°¡ ¹ß»ýÇß´ÂÁö¸¦ È®ÀÎÇÏ°í accept()¸¦ È£ÃâÇÏ´Â ¿¹ÀÌ´Ù.

if (WSAGETSELECTEVENT(lParam) == FD_ACCEPT) {

m_clientS = accept(m_s, NULL, NULL);

}

¢º ¾î¶² ¼ÒÄÏ¿¡¼­ À̺¥Æ®°¡ Çϳª ¹ß»ýÇÏ¸é ¸Þ½ÃÁö Àü¼ÛÀº Çѹø¸¸ ÀϾ´Ù. ±×·¯³ª ÀÌ ¼ÒÄÏ¿¡ °°Àº Á¾·ùÀÇ À̺¥Æ®°¡ ´Ù½Ã ¹ß»ýÇÒ ¼ö Àִµ¥, ÀÌ¿Í°°ÀÌ °°Àº À̺¥Æ®°¡ ´Ù½Ã ¹ß»ýÇÒ ¶§¸¶´Ù »õ·Î¿î ¸Þ½ÃÁö°¡ ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î Àü´ÞµÇµµ·Ï ÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù.

¢º ¿¹¸¦µé¾î FD_READ À̺¥Æ®°¡ ¹ß»ýÇÑ ¼ÒÄÏ¿¡ ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ recv() ÇÔ¼ö¸¦ È£ÃâÇÏ¿© µ¥ÀÌÅ͸¦ ÀоîµéÀÎ ÈÄ¿¡ »õ·Î¿î µ¥ÀÌÅÍ°¡ ¼ö½ÅµÇ¸é FD_READ À̺¥Æ®°¡ ´Ù½Ã ¹ß»ýÇÏ¿©¾ß À̸¦ ÀÐÀ» ¼ö ÀÖ´Ù.

¢º ÀÌ°ÍÀº recv() È£Ãâ½Ã ³»ºÎÀûÀ¸·Î ÀÚµ¿À¸·Î 󸮵ǵµ·Ï µÇ¾î ÀÖ´Ù(Áï, revc() È£ÃâÀÌ WASAsyncSelect()¸¦ ´Ù½Ã È£ÃâÇÑ È¿°ú¸¦ ÁØ´Ù).

¢º Ç¥ 5-4¿¡ °°Àº Á¾·ùÀÇ ¸Þ½ÃÁö¸¦ ¹Ýº¹ÇÏ¿© ¹ß»ý½ÃÅ°µµ·Ï ÇÏ´Â ÇÔ¼öµé°ú ÇØ´ç À̺¥Æ®¸¦ Á¤¸®ÇÏ¿´´Ù.

¢º ¿¹¸¦µé¾î FD_ACCEPT À̺¥Æ®°¡ ¹ß»ýÇÏ¿´À» ¶§ accept()¸¦ È£ÃâÇÏ¿© À̸¦ ó¸®ÇÏ¸é »õ·Î¿î FD_ACCEPT°¡ ¹ß»ýÇÒ ¶§ °°Àº Á¾·ùÀÇ ¸Þ½ÃÁö°¡ ´Ù½Ã ÀÀ¿ë ÇÁ·Î±×·¥¿¡°Ô Àü´ÞµÈ´Ù.

¸Þ½ÃÁö ¹Ýº¹ ¹ß»ý ÇÔ¼ö

°ü·Ã À̺¥Æ®

accept() FD_ACCEPT
send(), sendto() FD_WRITE
recv(), recevfrom() FD_READ
recv() FD_OOB

Ç¥ 5-4 ¸Þ½ÃÁö ¹Ýº¹ ¹ß»ý ÇÔ¼ö

5.2.3 À©¼ÓÀÇ IP ÁÖ¼Ò º¯È¯ ÇÔ¼ö

(1) WSAAsyncGetHostByAddr()

¢º IP ÁּҷκÎÅÍ ÇØ´ç È£½ºÆ®ÀÇ À̸§°ú ±âŸ Á¤º¸¸¦ ¾Ë¾Æ³»±â À§ÇÑ ºñµ¿±â ÇÔ¼öÀ̸ç BSD ¼ÒÄÏÀÇ gethostbyaddr()°ú ¸¶Âù°¡Áö·Î hostent ±¸Á¶Ã¼¸¦ ¸®ÅÏÇÑ´Ù.

¢º hostent ±¸Á¶Ã¼ÀÇ ³»¿ëÀº ¾Æ·¡¿Í °°´Ù.

struct hostent {

char FAR * h_name; /* È£½ºÆ® À̸§ */

char FAR * FAR * h_aliases; /* È£½ºÆ®ÀÇ º°¸í ¸ñ·Ï */

shor h_addrtype; /* È£½ºÆ® ÁÖ¼Ò Å¸ÀÔ */

short h_length; /* ÁÖ¼ÒÀÇ ±æÀÌ */

char FAR * FAR * h_addr_list; /* ÁÖ¼Ò ¸ñ·Ï */

#define h_addr h_addr_list[0] /* ´ëÇ¥ÀûÀÎ ÁÖ¼Ò¸¦ h_addr¿¡ ÀúÀå */

};

¢º WSAAsyncGetHostByAddr()ÀÇ »ç¿ë ¹®¹ýÀº ´ÙÀ½°ú °°´Ù.

HANDLE WSAAsyncGetHostByAddr (

HWND Hwnd, /* À©µµ¿ì ÇÚµé */

unsigned int Msg, /* ÀÌ ÇÔ¼ö Á¾·á½Ã Àü¼ÛÇÒ ¸Þ½ÃÁö */

const char *addr, /* È£½ºÆ®ÀÇ IP ÁÖ¼Ò */

int len, /* addrÀÇ ±æÀÌ */

int type, /* ÁÖ¼Ò Å¸ÀÔÀ¸·Î ÀÎÅͳݿ¡¼­´Â AF_INET */

char *buf, /* hostent ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ */

int buflen); /* bufÀÇ ±æÀÌ */

¢º ¾Æ·¡´Â WSAAsyncGetHostByAddr()ÀÇ »ç¿ë ¿¹Àε¥ IP ÁÖ¼Ò°¡ 203.252.65.3ÀΠȣ½ºÆ®ÀÇ µµ¸ÞÀÎ ³×ÀÓÀ» ¸Þ½ÃÁö ¹Ú½º¿¡ Ãâ·ÂÇÑ´Ù.

¢º ¾Æ·¡¿¡¼­ PHOSTENT´Â hostent ±¸Á¶Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ Å¸ÀÔÀ» ÁöÁ¤Çϸç MAXGETHOSTSTRUCT´Â hostent ±¸Á¶Ã¼¸¦ ´ã±â¿¡ ÃæºÐÇÑ Å©±âÀÇ »ó¼ö·Î Winsock.h¿¡ Á¤ÀǵǾî ÀÖ´Ù.

u_long m_Addr ;

char m_lpszHostEntryBuf[MAXGETHOSTSTRUCT] ;

PHOSTENT m_phostent; /* hostent ±¸Á¶Ã¼ Æ÷ÀÎÅÍ */

m_Addr = inet_addr("203.252.65.3");

WSAAsyncGetHostByAddr(m_hWnd, WM_USER_ASYNCGETHOSTBYADDR,

(char *)&m_Addr, 4, PF_INET, m_lpszHostEntryBuf, MAXGETHOSTSTRUCT) ;

m_phostent = (PHOSTENT)m_lpszHostEntryBuf ;

MessageBox(hwnd, m_phostent->h_name, "È£½ºÆ® À̸§", MB_OK);

¢º ÇÑÆí WSAAsyncGetXByY°ú °°Àº ÇüÅÂÀÇ ºñµ¿±â ÇÔ¼öÀÇ ½ÇÇà °á°ú´Â lParam¿¡ µé¾îÀÖ°Ô µÈ´Ù.

¢º lParamÀÇ »óÀ§ 16ºñÆ®¿¡´Â ¿¡·¯Äڵ尡 ÇÏÀ§ 16ºñÆ®¿¡´Â ºñµ¿±â ÇÔ¼ö ½ÇÇà °á°ú°¡ µé¾îÀÖ´Â ¹öÆÛÀÇ Å©±â°¡ µé¾î ÀÖ´Ù.

¢º ÀÌ·¯ÇÑ ¿¡·¯ °ª°ú ¹öÆÛÀÇ Å©±â °ªÀ» lParamÀ¸·ÎºÎÅÍ Æí¸®ÇÏ°Ô ¾Ë¾Æ³»±â À§ÇÏ¿© WSAGETASYNCERROR()¿Í WSA- GETASYNCBUFLEN() ¸ÅÅ©·Î°¡ °¢°¢ Á¤ÀǵǾî ÀÖ´Ù.

(2) WSAAsyncGetServByName()

¢º ÀÌ ÇÔ¼ö´Â ftp, mail°ú °°Àº TCP/IP Ç¥ÁØ ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Æ÷Æ®¹øÈ£¸¦ ã±â À§ÇØ »ç¿ëµÇ´Â ºñµ¿±â ÇÔ¼öÀÌ´Ù.

¢º ÀÌ ÇÔ¼ö°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¸é servent¶ó´Â ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϴµ¥ servent ±¸Á¶Ã¼ÀÇ ³»¿ëÀº ´ÙÀ½°ú °°´Ù.

struct servent {

char FAR * s_name; /* °ø½ÄÀûÀÎ ¼­ºñ½º À̸§ */

char FAR * FAR * s_aliases; /* ¼­ºñ½ºÀÇ º°¸í ¸®½ºÆ® */

short s_port; /* Æ÷Æ®¹øÈ£ */

char FAR * s_proto; /* ÇÁ·ÎÅäÄÝ Á¾·ù */

};

¢º WSAAsyncGetServByName()ÀÇ »ç¿ë ¹®¹ýÀº ´ÙÀ½°ú °°´Ù.

HANDLE WSAAsyncGetServByName (

HWND Hwnd, /* ÀÌ ÇÔ¼öÀÇ ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÒ À©µµ¿ì ÇÚµé */

unsigned int Msg, /* ÀÌ ÇÔ¼ö Á¾·á½Ã Àü¼ÛÇÒ ¸Þ½ÃÁö */

const char *name, /* Æ÷Æ®¹øÈ£¸¦ ¾Ë°íÀÚ ÇÏ´Â ¼­ºñ½º À̸§ */

const char *proto, /* TCP³ª UDP¸¦ ÁöÁ¤(¶Ç´Â NULL) */

char *buf, /* servent ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ */

int buflen); /* bufÀÇ ±æÀÌ */

¢º ÀÌ ÇÔ¼öÀÇ »ç¿ë ¿¹·Î UDP ÇÁ·ÎÅäÄÝ·Î ±¸ÇöµÈ time ¼­ºñ½ºÀÇ Æ÷Æ®¹øÈ£¸¦ ã¾Æ³»¾î È­¸é¿¡ Ãâ·ÂÇÏ´Â ¿¹¸¦ ¾Æ·¡¿¡ º¸¿´´Ù.

¢º ¿©±â¼­ PSERVENT´Â servent ±¸Á¶Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ Å¸ÀÔÀ» ¸»ÇÑ´Ù.

PSERVENT m_pservent; /* servent ±¸Á¶Ã¼ Æ÷ÀÎÅÍ */

char m_lpszMsg[100]; /* È­¸é¿¡ Ãâ·ÂÇÒ ¸Þ½ÃÁö ¹öÆÛ */

char m_lpszServEntryBuf[MAXGETHOSTSTRUCT];

WSAAsyncGetServByName(m_hWnd, WM_USER_ASYNCGETSERVBYNAME, "time",

"udp", m_lpszServEntryBuf, MAXGETHOSTSTRUCT) ;

m_pservent = (PSERVENT)m_lpszServEntryBuf;

wsprintf(m_lpszMsg, "%s ¼­ºñ½º Æ÷Æ® : %d", m_pservent->s_name,

m_pservent->s_port);

(3) WSAAsyncGetHostByName()

¢º ÀÌ ÇÔ¼ö´Â È£½ºÆ® À̸§À» »ç¿ëÇÏ¿© IP ÁÖ¼Ò¸¦ ã¾Æ³»´Â ÇÔ¼öÀÌ¸ç »ç¿ë ¹®¹ýÀº ¾Æ·¡¿Í °°´Ù.

HANDLE WSAAsyncGetHostByName (

HWND hwnd, /* ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÒ À©µµ¿ì ÇÚµé */

unsigned int wMsg, /* ¼ö½ÅÇÒ ¸Þ½ÃÁö */

char FAR *name, /* ãÀ» È£½ºÆ® ³×ÀÓÀÇ Æ÷ÀÎÅÍ */

char FAR *buf, /* °á°ú°¡ ¸®ÅϵǴ ¹öÆÛÀÇ Æ÷ÀÎÅÍ */

int bufflen); /* ¹öÆÛÀÇ ±æÀÌ */


ÇöÀç°­Á : Winsock ÇÁ·Î±×·¡¹Ö ÀÌÀü: 5.1 À©¼ÓÀÇ ÀÌÇØ ´ÙÀ½: 5.3 À©¼Ó äÆà ¼­¹ö