그리고 사용자는 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. ; ov = event. ; s = GetSocketFromUserPtr(userPtr); if (ov = = receiveOverlapped[s]) { // overlapped receive가 성공했으니, // 받은 데이터를 처리한다. Process(s, userPtr, data[s]); s.OverlappedReceive(data[s], receiveOverlapped[s]); // ➏ } }