Have you done any window programming yet? If not, I'd suggest doing so to get some experience of it.
This MSDN page gives you pretty much all the information you need to know about asynchronous sockets.
Create an invisible window, associate the socket(s) with it using WSASyncSelect, and implement a message pump like so:
// Declare this somewhere else
MSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
This code should be executed from the same thread as the thread that owns the window (which I'm guessing will be the main thread), and it works in a way that simply checks for messages rather than blocking while waiting for window messages (the latter is the standard way of writing window applications), this allows you to execute this code in a main loop. However, if the application only needs to do anything when there is socket activity, replace PeekMessage with GetMessage, so that you don't suck up CPU time unnecessarily.
I can give you more precise instructions when I've picked my PC up.