À©¼Ó API : WSAWaitForMultipleEvents - ÁöÁ¤µÈ À̺¥Æ® °´Ã¼ÀÇ Çϳª ȤÀº ¸ðµÎ°¡ ½ÅÈ£ »óŸ¦ ±â´Ù¸°´Ù. ȤÀº Á¦ÇÑ ½Ã°£ÀÌ Áö³µ´ÂÁö È®ÀÎÇÑ´Ù.
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

WSAWaitForMultipleEvents

WSAWaitForMultipleEvents ÇÔ¼ö´Â À̺¥Æ® °´Ã¼ÀÇ ÀüºÎ ȤÀº ÇϳªÀÇ ½ÅÈ£ »óÅÂ, Á¦ÇÑ ½Ã°£ ȤÀº ¿Ï·á ·çƾ (completion routine)ÀÇ ½ÇÇà½Ã ¹Ýȯ ÇÑ´Ù.

»ç¿ë ¹ý

DWORD WSAWaitForMultipleEvents( 
  __in  DWORD cEvents, 
  __in  const WSAEVENT *lphEvents, 
  __in  BOOL fWaitAll, 
  __in  DWORD dwTimeout, 
  __in  BOOL fAlertable 
); 
 

¸Å°³ º¯¼ö

  • cEvents
    À̺¥Æ® Çڵ鷯 ¹è¿­À» °¡¸®Å°´Â Æ÷ÀÎÅÍ lphEvents¿¡ ÀÖ´Â À̺¥Æ® °´Ã¼ÀÇ °³¼ö. À̺¥Æ® °´Ã¼ ÇÚµéÀÇ ÃÖ´ë °³¼ö´Â WAS_MAXIMUM_WAIT_EVENTS ¸¸Å­ÀÌ´Ù. ¹Ýµå½Ã Çϳª ÀÌ»óÀÇ À̺¥Æ® °´Ã¼°¡ ÁöÁ¤ µÇ¾î¾ß ÇÑ´Ù.
  • lphEvents
    À̺¥Æ® °´Ã¼ Çڵ鷯 ¹è¿­ÀÇ Æ÷ÀÎÅÍ. ÀÌ ¹è¿­¿¡´Â ¼­·Î ´Ù¸¥ ŸÀÔÀÇ À̺¥Æ® °´Ã¼°¡ Æ÷Ç﵃ ¼ö ÀÖ´Ù.
  • fwaitAll
    ±â´Ù¸®´Â ¹æ½ÄÀ» ÁöÁö¾îÇÑ´Ù. TRUE¶ó¸é lphEvents ¹è¿­¿¡ Æ÷ÇÔµÈ ¸ðµç À̺¥Æ® °´Ã¼°¡ ½ÅÈ£ »óŰ¡ µÇ¾î¾ß ¹ÝȯÇÑ´Ù. FALSE¶ó¸é ¹è¿­¿¡ Æ÷ÇÔµÈ À̺¥Æ® °´Ã¼ Áß Çϳª¶óµµ ½ÅÈ£ »óŰ¡ µÇ¸é ¹ÝȯÇÑ´Ù.
  • dwTimeout
    ½Ã°£ Á¦ÇÑÀ» ÁöÁ¤ÇÑ´Ù. ´ÜÀ§´Â ¹Ð¸®¼¼ÄÁµåÀÌ´Ù. Á¦ÇÑ ½Ã°£À» Áö³ª¸é À̺¥Æ® °´Ã¼°¡ ½ÅÈ£»óŰ¡ µÇÁö ¾Ê¾Ò´õ¶óµµ ¹Ýȯ ÇÑ´Ù.
  • fAlertable
    ½Ã½ºÅÛÀÌ ¿Ï·á ·çƾÀ» ½ÇÇà½Ãų ¼ö ÀÖ°Ô µÇ¾úÀ» ¶§, alert wait Çϰí ÀÖ´Â ¾²·¹µå¸¦ ±ú¿î´Ù. ¸¸¾à TRUE¶ó¸é ½Ã½ºÅÛ ¿Ï·á ·çƾÀÌ ½ÇÇàµÉ ¶§, alterable wait »óÅ¿¡ ÀÖ´Â ¾²·¹µåÀÇ WASWaitForMultipleEvents ÇÔ¼ö°¡ ¹ÝȯÇÑ´Ù. ÀÌ °æ¿ì WSA_WAIT_IO_COMPLETIONÀÌ ¹ÝȯµÈ´Ù. ¸¸¾à FALSE ¶ó¸é ¾²·¹µå´Â altertable wait »óÅ¿¡ ³õÀÌÁö ¾Ê°í ¿Ï·á ·çƾµµ ½ÇÇàµÇÁö ¾Ê´Â´Ù.

¹Ýȯ °ª

¼º°øÇÏ¸é ¾Æ·¡ÀÇ °ªµé Áß Çϳª¸¦ ¹ÝȯÇÑ´Ù.
  • WSA_WAIT_EVENT_0 ¿¡¼­ (WSA_WAIT_EVENT_0 + Events - 1)
    fWaitAll ¸Å°³ º¯¼ö°¡ FALSE À̸é, ½ÅÈ£ »óŰ¡ µÈ À̺¥Æ® °´Ã¼ÀÇ ¹è¿­ À妽º¸¦ ¹ÝȯÇÑ´Ù.
  • WAIT_IO_COMPLETION
    ÇѰ³ ÀÌ»óÀÇ ¿Ï·á ·çƾÀÌ ½ÇÇà Áغñ°¡ µÇ¾ú´Ù.
  • WAS_WAIT_TIMEOUT
    fwaitAll Á¶°ÇÀ» ¸¸Á·½ÃŰÁö ¸øÇÑ »óÅ¿¡¼­ ŸÀÓ ¾Æ¿ôÀÌ ¹ß»ý Çß´Ù.

½ÇÆÐÇϸé WSA_WAIT_FAILED¸¦ ¹Ýȯ ÇÑ´Ù. ¿¡·¯ ÄÚµå´Â WSAGetLastErrorÇÔ¼ö·Î °¡Á®¿Ã ¼ö ÀÖ´Ù.

¼³¸í

WSAWaitForMultipleEvents ÇÔ¼ö´Â ¸¸Á· ÇÏ´Â Á¶°ÇÀ» ±â´Ù¸®±â À§Çؼ­ »ç¿ëÇÑ´Ù. ¸¸¾à Á¶°ÇÀÌ ÃæÁ·µÇÁö ¾Ê´Â´Ù¸é, ÇÔ¼ö¸¦ È£ÃâÇÑ ¾²·¹µå´Â ±â´Ù¸² »óÅ¿¡ ³õÀÌ°Ô µÈ´Ù.

¿¹Á¦

MSDN ¿¹Á¦ ±×´ë·Î ½èÀ½. ¿¡ÄÚ ¼­¹ö ¿¹Á¦ Çϳª ¸¸µé¾î¾ß °ÚÀ½.
#include <windows.h> 
#include <stdio.h> 
#include "winsock2.h" 
 
#define DATA_BUFSIZE 4096 
 
void main() { 
  //----------------------------------------- 
  // Declare and initialize variables 
  WSABUF DataBuf; 
  char buffer[DATA_BUFSIZE]; 
  DWORD EventTotal = 0,  
    RecvBytes = 0,  
    Flags = 0,  
    BytesTransferred = 0,  
    CallBack = 0; 
  WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS]; 
  WSAOVERLAPPED AcceptOverlapped; 
  SOCKET ListenSocket, AcceptSocket; 
 
  //----------------------------------------- 
  // Initialize Winsock 
  WSADATA wsaData; 
  WSAStartup(MAKEWORD(2,2), &wsaData); 
 
  //----------------------------------------- 
  // Create a listening socket bound to a local 
  // IP address and the port specified 
  ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
  u_short port = 27015; 
  char* ip; 
  sockaddr_in service; 
  service.sin_family = AF_INET; 
  service.sin_port = htons(port); 
  hostent* thisHost; 
  thisHost = gethostbyname(""); 
  ip = inet_ntoa (*(struct in_addr *)*thisHost->h_addr_list); 
     
  service.sin_addr.s_addr = inet_addr(ip); 
 
  //----------------------------------------- 
  // Bind the listening socket to the local IP address 
  // and port number 
  bind(ListenSocket, (SOCKADDR *) &service, sizeof(SOCKADDR)); 
 
  //----------------------------------------- 
  // Set the socket to listen for incoming 
  // connection requests 
  listen(ListenSocket, 1); 
  printf("Listening...\n"); 
 
  //----------------------------------------- 
  // Accept and incoming connection request 
  AcceptSocket = accept(ListenSocket, NULL, NULL); 
  printf("Client Accepted...\n"); 
 
  //----------------------------------------- 
  // Create an event handle and setup an overlapped structure. 
  EventArray[EventTotal] = WSACreateEvent(); 
  ZeroMemory(&AcceptOverlapped, sizeof(WSAOVERLAPPED)); 
  AcceptOverlapped.hEvent = EventArray[EventTotal]; 
  DataBuf.len = DATA_BUFSIZE; 
  DataBuf.buf = buffer; 
  EventTotal++; 
 
  //----------------------------------------- 
  // Call WSARecv to receive data into DataBuf on  
  // the accepted socket in overlapped I/O mode 
  if (WSARecv(AcceptSocket, &DataBuf, 1, &RecvBytes, &Flags, &AcceptOverlapped, NULL) == SOCKET_ERROR) { 
    if (WSAGetLastError() != WSA_IO_PENDING) 
      printf("Error occurred at WSARecv()\n"); 
  } 
 
  //----------------------------------------- 
  // Process overlapped receives on the socket 
  while (1) { 
    DWORD Index; 
 
    //----------------------------------------- 
    // Wait for the overlapped I/O call to complete 
    Index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE); 
 
    //----------------------------------------- 
    // Reset the signaled event 
    WSAResetEvent(EventArray[Index - WSA_WAIT_EVENT_0]); 
 
    //----------------------------------------- 
    // Determine the status of the overlapped event 
    WSAGetOverlappedResult(AcceptSocket, &AcceptOverlapped, &BytesTransferred, FALSE, &Flags); 
 
    //----------------------------------------- 
    // If the connection has been closed, close the accepted socket 
    if (BytesTransferred == 0) { 
      printf("Closing Socket %d\n", AcceptSocket); 
      closesocket(AcceptSocket); 
      WSACloseEvent(EventArray[Index - WSA_WAIT_EVENT_0]); 
      return; 
    } 
 
    //----------------------------------------- 
    // If data has been received, echo the received data 
    // from DataBuf back to the client 
    if (WSASend(AcceptSocket, &DataBuf, 1, &RecvBytes, Flags, &AcceptOverlapped, NULL) == SOCKET_ERROR) 
      printf("WSASend() is busted\n"); 
 
    //-----------------------------------------         
    // Reset the changed flags and overlapped structure 
    Flags = 0; 
    ZeroMemory(&AcceptOverlapped, sizeof(WSAOVERLAPPED)); 
 
    AcceptOverlapped.hEvent = EventArray[Index - WSA_WAIT_EVENT_0]; 
 
    //----------------------------------------- 
    // Reset the data buffer 
    DataBuf.len = DATA_BUFSIZE; 
    DataBuf.buf = buffer; 
  } 
} 
 
 


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