#include <process.h>

#include <iostream>
using namespace std;

#define _WIN32_WINNT 0x400
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

class CMySocket
{
public:
  SOCKET m_sock;
  HANDLE m_hThread;

  void Connect(const char *name)
  {
    m_sock = socket(PF_INET,SOCK_STREAM,0);
    SOCKADDR_IN sockAddr;
    sockAddr.sin_family = AF_INET;
    hostent *he = gethostbyname(name);
    sockAddr.sin_addr.s_addr = *(long*)gethostbyname(name)->h_addr;
    sockAddr.sin_port = htons(80);    
    connect(m_sock,(SOCKADDR*)&sockAddr,sizeof sockAddr);
  }

  void Recv(char *buf, int size)
  {
    recv(m_sock,buf,size,0);
  }  
  
  void Close()
  {
    closesocket(m_sock);
  }
};

CMySocket g_mySocket;

unsigned __stdcall SubThread(LPVOID pParam)
{
  char buf[100];
  g_mySocket.Recv(buf,sizeof buf);
  return 0;
}

VOID CALLBACK APCProc(ULONG_PTR dwParam)
{
  g_mySocket.Close();
}

void main()
{
  WSAData wsaData;
  WSAStartup(2,&wsaData);

  g_mySocket.Connect("www.microsoft.com");

  HANDLE hThread = (HANDLE)_beginthreadex(0,0,SubThread,0,0,0);

  Sleep(3000);
  QueueUserAPC(APCProc,hThread,0);  
  cout << "Waiting..." << endl;
  WaitForSingleObject(hThread,INFINITE);
  cout << "Closing complete" << endl;
}
