下面定义网络异步事件的回调函数void CSocketSeverDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)
{
file://调用Winsock API函数,得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);file://调用Winsock API函数,得到发生此事件的客户端套接字
SOCKET CurSock= (SOCKET)wParam;switch(iEvent)
{
case FD_ACCEPT: file://客户端连接请求事件
OnAccept(CurSock);
break;
case FD_CLOSE: file://客户端断开事件:
OnClose(CurSock);
break;
case FD_READ: file://网络数据包到达事件
OnReceive(CurSock);
break;
case FD_WRITE: file://发送网络数据事件
OnSend(CurSock);
break;
default: break;
}
} 谁能给个例子,在onaccept,onsend,onreceive中该写什么,如果发送接受文件的话

解决方案 »

  1.   

    如果希望在用户界面线程中使用阻塞socket,则可以使用CSocket。它在非阻塞socket基础之上实现了阻塞操作,在阻塞期间实现了消息循环。对于CSocket,处理网络事件通知的函数OnAccept、OnClose、OnReceive仍然可以使用,OnConnect、OnSend在CSocket中永远不会被调用,另外OnOutOfBandData在CSocket中不鼓励使用。CSocket对象在调用Connect、Send、Accept、Close、Receive等成员函数后,这些函数在完成任务之后(连接被建立、数据被发送、连接请求被接收、socket被关闭、数据被读取)之后才会返回。因此,Connect和Send不会导致OnConnect和OnSend被调用。如果覆盖虚拟函数OnReceive、OnAccept、OnClose,不主动调用Receive、Accept、Close,则在网络事件到达之后导致对应的虚拟函数被调用,虚拟函数的实现应该调用Receive、Accept、Close来完成操作。下面,就一个函数Receive来考察CSocket如何实现阻塞操作和消息循环的。int CSocket::Receive(void* lpBuf, int nBufLen, int nFlags){//m_pbBlocking是CSocket的成员变量,用来标识当前是否正在进行//阻塞操作。但不能同时进行两个阻塞操作。if (m_pbBlocking != NULL){WSASetLastError(WSAEINPROGRESS);return FALSE;}//完成数据读取int nResult;while ((nResult = CAsyncSocket::Receive(lpBuf, nBufLen, nFlags)) == SOCKET_ERROR){if (GetLastError() == WSAEWOULDBLOCK){//进入消息循环,等待网络事件FD_READif (!PumpMessages(FD_READ))return SOCKET_ERROR;}elsereturn SOCKET_ERROR;}return nResult;}其中:参数1指定一个缓冲区保存读取的数据;参数2指定缓冲区的大小;参数3取值MSG_PEEK(数据拷贝到缓冲区,但不从输入队列移走),或者MSG_OOB(处理带外数据),或者MSG_PEEK|MSG_OOB。Receive函数首先判断当前CSocket对象是否正在处理一个阻塞操作,如果是,则返回错误WSAEINPROGRESS;否则,开始数据读取的处理。读取数据时,如果基类CAsyncSocket的Receive读取到了数据,则返回;否则,如果返回一个错误,而且错误号是WSAEWOULDBLOCK,则表示操作阻塞,于是调用PumpMessage进入消息循环等待数据到达(网络事件FD_READ发生)。数据到达之后退出消息循环,再次调用CAsyncSocket的Receive读取数据,直到没有数据可读为止。PumpMessages是CSocket的成员函数,它完成以下工作:(1)设置m_pbBlocking,表示进入阻塞操作。(2)进行消息循环,如果有以下事件发生则退出消息循环:收到指定定时器的定时事件消息WM_TIMER,退出循环,返回TRUE;收到发送给本socket的消息WM_SOCKET_NOTIFY,网络事件FD_CLOSE或者等待的网络事件发生,退出循环,返回TRUE;发送错误或者收到WM_QUIT消息,退出循环,返回FALSE;(3)在消息循环中,把WM_SOCKET_DEAD消息和发送给其他socket的通知消息WM_SOCKET_NOFITY放进模块线程状态的通知消息列表m_listSocketNotifications,在阻塞操作完成之后处理;对其他消息,则把它们送给目的窗口的窗口过程处理。
      

  2.   

    CAsyncSocket类用DoCallBack函数处理MFC消息,当一个网络事件发生时,DoCallBack函数按网络事件类型:FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT分别调用OnReceive、OnSend、OnAccept、OnConnect函数。
    由于MFC把这些事件处理函数定义为虚函数,所以要生成一个新的C++类,以重载这些函数,做法如下: 以Public方式继承CAsyncSocket类,生成新类MySock; 为MySock类添加虚函数OnReceive、OnConnect、OnSend 4. 在MySock.ccp中添加以下代码 #include "CSockClient.h"
    #include "CSockClientDlg.h"5. 在MySock.h中添加以下代码 public:
    BOOL m_bConnected; //是否连接
    UINT m_nLength; //消息长度
    char m_szBuffer[4096]; //消息缓冲区6. 在MySock.ccp中重载各函数 MySock::MySock()
    {
    m_nLength=0;
    memset(m_szBuffer,0,sizeof(m_szBuffer));
    m_bConnected=FALSE;
    }MySock::~MySock()
    {
    //关闭套接字
    if(m_hSocket!=INVALID_SOCKET)
    Close();
    }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);
    }void MySock::OnSend(int nErrorCode) 
    {
    Send(m_szBuffer,m_nLength,0);
    m_nLength=0;
    memset(m_szBuffer,0,sizeof(m_szBuffer));
    //继续提请一个“读”的网络事件,接收Server消息
    AsyncSelect(FD_READ);
    CAsyncSocket::OnSend(nErrorCode);
    }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);
    }
      

  3.   

    错了,这些不是mfc的,是api的和消息组成的
    这些都是我自定义的函数,