关于CAsyncSocket的OnReceive和Receive区分的有关问题

关于CAsyncSocket的OnReceive和Receive区分的问题
本帖最后由 wutongye1216 于 2013-01-06 15:48:30 编辑
看资料看的我把他俩彻底混了。同样的问题也出现在send和OnSend等函数上。下面是资料里的一段代码

void MySock::OnReceive(int nErrorCode) 

m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0); 
//下面两行代码用来获取对话框指针
CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp(); 
CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp->m_pMainWnd; 
pDlg->m_MSGS.InsertString(0,m_szBuffer); 
memset(m_szBuffer,0,sizeof(m_szBuffer)); 
CAsyncSocket::OnReceive(nErrorCode);
}

MySock是派生于CAsyncSocket的类。如果Receive导致OnReceive的调用的话那函数是不是老在第一句话上循环了呀?
资料里还有一段

void MySock::OnConnect(int nErrorCode) 

if (nErrorCode==0)

m_bConnected=TRUE; 
CCSockClientApp* pApp=(CCSockClientApp*)AfxGetApp(); 
CCSockClientDlg* pDlg=(CCSockClientDlg*)pApp- m_pMainWnd; 
memcpy(m_szBuffer,"Connected to ",13); 
strncat(m_szBuffer,pDlg- >m_szServerAdr, sizeof(pDlg->m_szServerAdr)); 
pDlg->m_MSGS.InsertString(0,m_szBuffer); 
AsyncSelect(FD_READ); 
////提请一个“读”的网络事件,准备接收 

CAsyncSocket::OnConnect(nErrorCode);
}

这里面有对于nErrorCode的判断,是这个资料写错了还是OnReceive本来就不用??
顺便补充一点AsyncSelect(FD_READ); 这句话的作用是什么?换成AsyncSelect(FD_WRITE);呢? 
CAsyncSocket OnReceive Receive 区分

------解决方案--------------------
1、简单起见,你记住,OnReceive中只能调用一次Receive。他的含义是,你被告知可以接收了。
2、弄清楚OnSend是你水平进阶的标志,他是实现基于异步的阻塞发送的关键。去看CSocket源码,你会大有收获。弄懂后,你会觉得CSocket比CAsyncSocket好用的多。另外,一般人写程序都用不到OnSend这玩意。因为控制好发送缓冲区、发送频率、突发数据量,你就可以不关心OnSend。
3、如果简单的通信程序既有收又有发,我推荐首选CSocket,而不是CAsycnSocket。
4、OnReceive中的nErrorCode很关键,他是套接字发生异常时的错误代码。他会指导你处理错误而不是继续接收。