Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269317
  • 博文数量: 45
  • 博客积分: 1618
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 10:13
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(25)

2010年(19)

我的朋友

分类: C/C++

2010-10-07 21:41:29

其实到现在也没有用到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类,导致重载无效,这是个杯具。待续
阅读(2668) | 评论(0) | 转发(0) |
0

上一篇:CStringArray in mfc

下一篇:获取View指针

给主人留下些什么吧!~~