VC的朋友们新年好!小弟自学MFC几个月,还是很菜,有两个套接字的问题不明白,请个位高手指点,先谢过罗!问题1 是关与CAsyncSocket的内部实现的一个函数,书中的原码:void PASCAL CAsyncSocket::AttachHandle(SOCKET hsocket, CAsyncSocket * pSocket, BOOL bDead)
{
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;(这是什么,是创建一个线程吗?)
if (!bDead)
{
ASSERT(CAsyncSocket::LookupHandle (hSocket, bDead ==NULL);
if (pState->m_pmapSocketHandle->IsEmpty( )) (这函数是什么意思?)
{
CSoketWnd* pWnd = new CSocketWnd;
pWnd->m_hWnd=NULL;
用pWnd的CreateEx创建一个窗口
pState->m_hSocketWindow = pWnd->m_hWnd;
}
pState->m_pmapSocketHandle->SetAt((void*) hSocket, pSocket);
}
else
{ /*拆除Socket*/
}
为什么书中说只是第一CAsyncSocket 或起派生类实例创建的时候才创建这个窗口,到底pState是不是线程,如过是的话那这个线程是不是主要被WSAAsyncSelect占用用来监视套接字,有事件时发送消息,没有的话别的线程就做其它事 问题二 :也是CAsyncSocket的内部实现的一个函数
void PASCAL CAsyncSocet::DoCallBack (WPARAM wParam, LPARAM lparam)
{
…………………………省略……………………
pSocket=CAsynSocket::LookupHandle((SOCKET) wParam, FLASE);
if (pSocket==NULL)
{
pSocket=CAsynSocket::LookupHandle
(INVALID_SOCKET, FLASE); (这是干什么用的)
ASSERT(pSocket->m_hSocket = (SOCKET) wParam;
CAsyncSocket::DetaHandle(INVALID_SOCKET,
FLASE);
CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FLASE);(为什么要回到问题一那个函数,也就是间接调用DoCallBack的函数?)
}
…………………………………………………………
}
问题三:
书上有一个从CAsyncSocket派生的类说是用双缓冲区管理Socket的数据,到底什么是双缓冲区。重载的OnSend函数的工能是试图发送缓冲区头部的数据,OnReceive的功能是读出的数据放在接收缓冲区的尾部。请问怎么控制数据放在尾部或头部?怎么只发送头部的数据?
多谢罗!
{
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;(这是什么,是创建一个线程吗?)
if (!bDead)
{
ASSERT(CAsyncSocket::LookupHandle (hSocket, bDead ==NULL);
if (pState->m_pmapSocketHandle->IsEmpty( )) (这函数是什么意思?)
{
CSoketWnd* pWnd = new CSocketWnd;
pWnd->m_hWnd=NULL;
用pWnd的CreateEx创建一个窗口
pState->m_hSocketWindow = pWnd->m_hWnd;
}
pState->m_pmapSocketHandle->SetAt((void*) hSocket, pSocket);
}
else
{ /*拆除Socket*/
}
为什么书中说只是第一CAsyncSocket 或起派生类实例创建的时候才创建这个窗口,到底pState是不是线程,如过是的话那这个线程是不是主要被WSAAsyncSelect占用用来监视套接字,有事件时发送消息,没有的话别的线程就做其它事 问题二 :也是CAsyncSocket的内部实现的一个函数
void PASCAL CAsyncSocet::DoCallBack (WPARAM wParam, LPARAM lparam)
{
…………………………省略……………………
pSocket=CAsynSocket::LookupHandle((SOCKET) wParam, FLASE);
if (pSocket==NULL)
{
pSocket=CAsynSocket::LookupHandle
(INVALID_SOCKET, FLASE); (这是干什么用的)
ASSERT(pSocket->m_hSocket = (SOCKET) wParam;
CAsyncSocket::DetaHandle(INVALID_SOCKET,
FLASE);
CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FLASE);(为什么要回到问题一那个函数,也就是间接调用DoCallBack的函数?)
}
…………………………………………………………
}
问题三:
书上有一个从CAsyncSocket派生的类说是用双缓冲区管理Socket的数据,到底什么是双缓冲区。重载的OnSend函数的工能是试图发送缓冲区头部的数据,OnReceive的功能是读出的数据放在接收缓冲区的尾部。请问怎么控制数据放在尾部或头部?怎么只发送头部的数据?
多谢罗!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货