>> Ok so after doing some re-reading I guess I don't need to handle the FD_WRITE message at all (I can just send data when I need to), is that correct? <<

No, you send until you receive a WSAEWOULDBLOCK and then you have to wait for a FD_WRITE before you can issue another send. Your sending seems find except you don't need to change the send buffer size.

I don't know why it's not working. If you post something compilable, I can try it out.