그리고 사용자는 IOCP에서 I/O가 완료되었음을 알려 주는 완료 신호(completion event)를 꺼낼 수(pop) 있습니다. 소켓 개수가 1만 개라고 하더라도 이 중에서 I/O가 완료된 것들만 IOCP를 이용해서 바로 얻을 수 있기 때문에, 모든 소켓에서 루프를 돌지 않아도 됩니다.

    Tip

    Overlapped I/O와 마찬가지로 IOCP도 윈도에서만 사용 가능합니다.

     

    사용 예시를 알아봅시다.

    iocp = new iocp();              // ➊
    foreach(s in sockets)
    {
      iocp.add(s, GetUserPtr(s)); // ➋
      s.OverlappedReceive(data[s],
          receiveOverlapped[s]);  // ➏
    }
     
    events = iocp.wait(100ms);      // ➌
     
    foreach(event in events)        // ➍
    {
      // ➎
      // 위 iocp.add에 들어갔던 값을 얻는다.
      userPtr = event.userPtr;
      ov = event.overlappedPtr;
      s = GetSocketFromUserPtr(userPtr);
     
      if (ov = = receiveOverlapped[s])
      {
          // overlapped receive가 성공했으니,
          // 받은 데이터를 처리한다.
          Process(s, userPtr, data[s]);
     
          s.OverlappedReceive(data[s],
              receiveOverlapped[s]); // ➏
      }
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.