All these APIs follow a similar model which can be abstracted the same way. They are all waiting for when action is going to occur on a collection of sockets.
But IOCP - I/O Completion Ports as used by Windows (although IBM AIX Unix also does it this way) uses a model when the caller had to allocate a bucket of memory for each socket operation that we listen on.
My feeling is that this make IOCP heavier in overhead but I could be wrong. To really understand it you would need to more empirical work than I have had time to: