CAsyncSocket和CSocket
来源:互联网 发布:汽车动力仿真软件 编辑:程序博客网 时间:2024/05/20 09:26
推荐读物《Windows网络编程》编者<美>琼斯 译者杨合庆清华大学出版社,其中最重要的一个章节是《WinsockI/O方法》。如果本书为第一版,则是第八章;如果为第二版,则是第五章。本篇摘抄自网上的资料,略有删减。
CAsyncSocket
看类名就知道,它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事件,你关心的事件被指定以后,这个Socket默认就被用作了异步方式。那么CAsyncSocket内部到底是如何将事件交给你的呢?
CAsyncSocket的Create()函数,除了创建了一个SOCKET以外,还创建了个CSocketWnd窗口对象,并使用WSAAsyncSelect()将这个SOCKET与该窗口对象关联,以让该窗口对象处理来自Socket的事件(消息),然而CSocketWnd收到Socket事件之后,只是简单地回调CAsyncSocket::OnReceive(),CAsyncSocket::OnSend(),CAsyncSocket::OnAccept(),CAsyncSocket::OnConnect()等虚函数。所以CAsyncSocket的派生类,只需要在这些虚函数里添加发送和接收的代码。
简化后,大致的代码为:
bool CAsyncSocket::Create(long lEvent ) //参数lEvent是指定你所关心的Socket事件
{
m_hSocket = socket(PF_INET, SOCK_STREAM, 0 ); //创建Socket本身
CSocketWnd* pSockWnd =new CSocketWnd; //创建响应事件的窗口,实际的这个窗口在AfxSockInit()调用时就被创建了。
pSockWnd->Create(...);
WSAAsyncSelect(m_hSocket, pSockWnd->m_hWnd, WM_SOCKET_NOTIFY,lEvent ); //Socket事件和窗口关联
}
static void PASCALCAsyncSocket::DoCallBack(WPARAMwParam, LPARAM lParam)
{
CAsyncSocketSocket;
Socket.Attach( (SOCKET)wParam ); //wParam就是触发这个事件的Socket的句柄
intnErrorCode = WSAGETSELECTERROR(lParam); //lParam是错误码与事件码的合成
switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
pSocket->OnReceive(nErrorCode);
break;
case FD_WRITE:
pSocket->OnSend(nErrorCode);
break;
case FD_OOB:
pSocket->OnOutOfBandData(nErrorCode);
break;
case FD_ACCEPT:
pSocket->OnAccept(nErrorCode);