더북(TheBook)

그리고 사용자는 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]); // ➏
  }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.