Here's part of an SMTP client application I created. Once I connect to the server I start a thread and pass it the "this" pointer. The thread receives data and calls my send member function depending on what data it gets. This is more then you need but it shows you how to start the thread and pass in a pointer to the class you started it from which can be very handy.
int CSMTPClientDlg::OnConnect()
{
if(Sock1.SetUp())
return 1;
UpdateData(TRUE);
// open socket
if(Sock1.OpenSock(m_csIPaddress,m_iPortNumber))
return 1;
// update dialog
m_csSocketStatus.Format("Opened port %i",m_iPortNumber);
UpdateData(FALSE);
// connect to server
if(Sock1.Connect(&addrRemote))
return 1;
m_ctrlData.EnableWindow(TRUE); // enable data field
m_ctrlSend.EnableWindow(FALSE); // enable send button
char temp[30] = "Connected to ";
char* temp2 = inet_ntoa(addrRemote.sin_addr);
strcat(temp,temp2);
m_csConnectionStatus = temp;//"Connected to " + inet_ntoa(addrRemote.sin_addr); // update status
UpdateData(FALSE);
// start receive thread
CWinThread* pRecvThread = AfxBeginThread(ReceiveThread,(LPVOID)this);
// update dialog
m_ctrlConnect.EnableWindow(FALSE);
UpdateData(FALSE);
return 0;
}
UINT ReceiveThread(LPVOID pParam)
{
CSMTPClientDlg* pObject = (CSMTPClientDlg*)pParam;
do{
m_csRecData = Sock1.RecData();
cdLogging.SetText(m_csRecData);
switch(iPacketCount)
{
case SERVER:
iPacketCount++;
pObject->AutoSend();
break;
case HELLO:
if(strncmp(m_csRecData,messageArray[iPacketCount].recvMessage,3) != 0){
AfxMessageBox("Received incorrect response from server."

;
// display received data and expected data in log window.
}
else{
iPacketCount++;
pObject->AutoSend();
}
break;
case MAILFROM:
if(strncmp(m_csRecData,messageArray[iPacketCount].recvMessage,3) != 0){
AfxMessageBox("Received incorrect response from server."

;
// display received data and expected data in log window.
}
else{
iPacketCount++;
pObject->AutoSend();
}
break;
case RCPTTO:
if(strncmp(m_csRecData,messageArray[iPacketCount].recvMessage,3) != 0){
AfxMessageBox("Received incorrect response from server."

;
// display received data and expected data in log window.
}
else{
iPacketCount++;
pObject->AutoSend();
}
break;
case DATA:
if(strncmp(m_csRecData,messageArray[iPacketCount].recvMessage,3) != 0){
AfxMessageBox("DATA Received incorrect response from server."

;
// display received data and expected data in log window.
}
pObject->EnableSendButton();
iPacketCount++;
break;
default:
;
}
}while(bExitThread == FALSE);
AfxEndThread(NULL);
return 0;
}