Using winsock, you can configure sockets or seperate I/O operations to \"overlap\". This means that calls to perform I/O are returned immediately, while the actual operation
Use boost::asio. Hands down. It has a mild learning curve, but it's cross-platform, and automatically uses the best available method for the system you're compiling on. There's simply no reason not to.
I know that this isn't quite an answer to your question, but it's the best advice I could give.