I've heard about IO completion ports before and that is extremely difficult to use
I don't think I/O completion ports are particularly hard to use. They are different from "select and read and write," true, but not THAT different. The documentation on MSDN is fairly complete and correct, so assuming that you know how to read technical reference documentation, it should work fine.
Another option, which will be portable between Linux and Windows (and some other OS-es) is to use boost::asio, which ends up using I/O completion ports on Windows, and epoll on Linux, and other "best" ways to do high-throughput I/O on other OS-es.