Originally Posted by Johnnie's Winsock Tutorial
A non-blocking socket returns immediately whenever it is told to do something, either with a successful result, an error, or nothing (indicating that there will be something to receive later). The disadvantage of using this type is that you'll have to manually query the socket to see if a result has come in on every function you call. You can pass a set of sockets to the select() function to see which ones are ready for reading, writing, or have returned errors.
Functions using asynchronous sockets also return immediately, but you can specify a message to send to your window procedure when a specified event has occurred.