雨过天晴 发表于 2015-2-11 20:26:28

CAsyncSocket CSocket使用记录

其实到现在也没有用到CSocket类,只用了CAsyncSocket类,介绍几个问题吧,CSocket用到再记录:
1、如果你没有在mfc向导里面添加socket支持,那么你就应该包含afxsock.h头文件,更加需要注意的是一定要调用AfxSocketInit()对socket环境进行初始化

if(!AfxSocketInit())
{   
    AfxMessageBox("Socket Init error!");
    return FALSE;
}
2、比较好的方法是单独创建一个类,比如CMySocket,并继承自CAsyncSocket类,声明一个实例m_cmdSocket,然后调用Create创建一个socket实例,如果是客户端,现在就可以调用Connect进行连接,如果是服务端就可以调用Listen进行监听,里面有个FormatMessage函数,可以将错误信息以字符串的形式输出出来,注意在Create的时候我只是监听了三种socket消息

    //只写了服务端
    if(!m_cmdSocket.Create(CPORT,SOCK_STREAM,FD_CONNECT|FD_ACCEPT|FD_CLOSE))
    {
      LPVOID lpMsgBuf;
      DWORD dw = GetLastError();
      FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0,
            NULL);
      MessageBox((LPCTSTR)lpMsgBuf);
    }
    if(!m_cmdSocket.Listen())
    {
      LPVOID lpMsgBuf;
      DWORD dw = GetLastError();
      FormatMessage(
            FORMAT_MESSAGE_ALLOCATE_BUFFER |
            FORMAT_MESSAGE_FROM_SYSTEM,
            NULL,
            dw,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            (LPTSTR) &lpMsgBuf,
            0,
            NULL);
      MessageBox((LPCTSTR)lpMsgBuf);
      m_cmdSocket.Close();
    }
3、下面我们就可以在CMySocket类里面重写某些函数,比如OnAccept(int nErrorCode),这样就是处理Accept消息了。void CDataSocket::OnAccept(int nErrorCode)
void CDataSocket::OnAccept(int nErrorCode)
{
    CAsyncSocket* pSocket = new CAsyncSocket;
    Accept(*pSocket);//在此就获得了socket句柄
    return;
}

4、我在使用过程中,明明已经重载了OnAccept函数,但是在函数里面设置断点却总是没有反应,查资料又查不到,最后实在国外的一个论坛上发现的,我声明变量的不是我自己的Socket类,而是CAsyncSocket类,导致重载无效,这是个杯具。待续
页: [1]
查看完整版本: CAsyncSocket CSocket使用记录