最近想起CAsyncSocket这个类,记得很早以前用过,现在却想不起来怎么用了,翻了翻以前的代码又看了看msdn感觉这个类做简单的异步socket太简单了,几行代码就可以搞定,在此先做个总结。

不管是客户端和服务端都要从CAsyncSocket这个类派生一个类来重载一系列Socket消息事件函数比如  CAsyncSocket::OnAccept  CAsyncSocket::OnReceive 等

1.服务端

1.1首先派生一个类用来监听

class CListenSocket : public CAsyncSocket
{
public:
public:
CListenSocket();
virtual ~CListenSocket();
void SetListBox(CListBox * ListBox) {m_ListBox = ListBox;} //这个ListBox是主窗口里面的一个客户端列表用来显示有几个客户端
void SetListBoxMsg(CListBox * ListBox) {m_ListBoxMsg = ListBox;} //这个ListBox是接收客户端消息的
public:
virtual void OnAccept(int nErrorCode);
virtual void OnClose(int nErrorCode);
CClientSocket * GetClientByIndex(int nIndex) //返回一个已经连接的客户端用来给指定客户端发消息
{
return m_ClientSocketList.GetAt(m_ClientSocketList.FindIndex(nIndex));
}
private:
CList<CClientSocket * > m_ClientSocketList; //这里要维护一个已经连接的客户端列表,这样服务器可以指定向哪个服务器发消息
CListBox * m_ListBox;
CListBox * m_ListBoxMsg;
};

要响应监视类的Accept事件

void CListenSocket::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
if (nErrorCode == )//如果成功
{
CClientSocket* pNewClientSocket = new CClientSocket(); //保存一个已经连接的客户端
BOOL bAccept=Accept(*pNewClientSocket);
if (bAccept)
{
m_ClientSocketList.AddTail(pNewClientSocket);
pNewClientSocket->SetListBox(m_ListBoxMsg);
CString SocketName;
UINT len = ;
pNewClientSocket->GetSockName(SocketName,len);
m_ListBox->AddString(SocketName); //客户端列表里显示这个已经连接的客户端ip
}
else
{
DWORD dwErr = GetLastError();
CString strErr;
strErr.Format(_T("accept 错误码=%d"),dwErr);
delete pNewClientSocket;
AfxMessageBox(strErr);
}
}
CAsyncSocket::OnAccept(nErrorCode);
}

已经连接客户端对象也是从CAsyncSocket派生来的、

class CClientSocket : public CAsyncSocket
{
public:
CClientSocket();
virtual ~CClientSocket();
virtual void OnReceive(int nErrorCode);
virtual void OnClose(int nErrorCode);
VOID SetListBox(CListBox * ListBox) {m_ListBox = ListBox;}
CListBox * m_ListBox;
private:
};

当服务端收到消息时要响应事件OnReceive

void CClientSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类 if (nErrorCode == )
{
char szBuf[] = {};
INT nReceiveCounts = Receive((VOID*)szBuf,);
if(m_ListBox != NULL)
m_ListBox->AddString(szBuf); } CAsyncSocket::OnReceive(nErrorCode);
}

1.2 监听

void CMfcSocketDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(m_ListenSocket != NULL)
return ;
BOOL bInit = AfxSocketInit();
if(!bInit)
{
AfxMessageBox(_T("socket 初始化失败 "));
return ;
}
m_ListenSocket = new CListenSocket();
BOOL bCreate = m_ListenSocket->Create();
if(!bCreate)
{
AfxMessageBox(_T("创建失败"));
delete m_ListenSocket;
m_ListenSocket = NULL;
} BOOL bListen = m_ListenSocket->Listen();
if(!bListen)
{
AfxMessageBox(_T("监听失败!"));
delete m_ListenSocket;
m_ListenSocket = NULL;
}
m_ListenSocket->SetListBox(&m_ListBoxClientList); //客户端列表
m_ListenSocket->SetListBoxMsg(&m_ListBoxRecMsg); //已经接收的消息
}

2.客户端

2.1 派生一个类用来作为客户端socket

#include "afxsock.h"
class CClientSocket :
public CAsyncSocket
{
public:
CClientSocket(void);
virtual ~CClientSocket(void); virtual void OnReceive(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode ); void SetListBox(CListBox * ListBox) {m_ListBox = ListBox;}
CListBox * m_ListBox;
};

想接收消息就要响应接收消息的事件

void CClientSocket::OnReceive(int nErrorCode)
{
if(nErrorCode == )
{
CString szBuf;
INT nReceiveCounts = Receive((VOID*)szBuf.GetBuffer(),);
m_ListBox->AddString(szBuf);
}
}

2.2 客户端对象的创建和连接

void CMfcSocketClientDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
BOOL bInit = AfxSocketInit();
if(!bInit)
{
AfxMessageBox(_T("socket 初始化失败 "));
return ;
}
if(m_ClientSocket == NULL)
{
m_ClientSocket = new CClientSocket;
m_ClientSocket->Create();
}
else
{
m_ClientSocket->Close();
}
m_ClientSocket->Connect(m_Ip,m_Port);
m_ClientSocket->SetListBox(&m_ListBox);
}

上个图片上源码供新手学习

源码:下载

使用CAsyncSocket总结的更多相关文章

  1. [转载]CAsyncSocket及CSocket注解

    MFC疑难注解:CAsyncSocket及CSocket MFC对SOCKET编程的支持其实是很充分的,然而其文档是语焉不详的.以至于大多数用VC编写的功能稍复杂的网络程序,还是使用API的.故CAs ...

  2. CAsyncSocket

    本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事 ...

  3. CAsyncSocket编程 MFC

    许多时候我们实现网络编程使用的是winsock api函数,虽然这些函数使用起来也很方便,很灵活,但是VC++的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现socket编程会 ...

  4. [转] CSocket 和CAsyncSocket类介绍

    微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易. CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法.这个类 ...

  5. CAsyncSocket只传输了一部分数据(UDP),后面是乱码

    void CCAsyncSocketDlg::OnBnClickedBtnSend() { UpdateData(TRUE); TCHAR ipstr[INET_ADDRSTRLEN]; DWORD ...

  6. CAsyncSocket create创建套接字失败

    解决方法: 在继承CAsyncSocket 类的子类的构造函数中加入以下代码: if (!AfxSocketInit()) AfxMessageBox(IDP_SOCKETS_INIT_FAILED) ...

  7. MFC中CAsyncSocket和CSocket

    原文链接:https://blog.csdn.net/libaineu2004/article/details/40395917 摘要部分重点: 1.CAsyncSocket类逐个封装了WinSock ...

  8. socket API CSocket CAsyncSocket 用法及区别

    要进行网络编程就要和Socket打交道,Socket有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而Socket也没什么特别.虽然同步好用,不费劲,但不能满 ...

  9. MFC下的网络编程(1)CAsyncSocket进行无连接(UDP)通信

    服务器端发送数据给客户端 先看服务器端: CAsyncSocket m_sockSend;                       //声明一个Socket对象 点击发送数据后,执行下面这些动作 ...

随机推荐

  1. activemq修改admin密码

    vim /usr/local/activemq/conf/jetty-realm.properties 用户名:密码,角色 mq: 123, admin 那么打开管理后台,用户是mq,密码是123,具 ...

  2. CodeFirst模式开发涉及到mysql简单使用

    在和同学写自己的小项目中,这次大胆的用到了“mysql”,毕竟是第一次在项目中使用,可我和同学就犯难了,我们没有真正意义上学过mysql,或者可以说,使用过mysql,当我们把项目放在www.git. ...

  3. 洛谷 P2678 跳石头【经典二分答案/贪心】

    题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石).在比赛过程中,选手们将从 ...

  4. Codeforces 868A Bark to Unlock【字符串+二维string输入输出+特判】

    A. Bark to Unlock time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. 百度之星资格赛 2016 Problem 1002

    本文链接:http://www.cnblogs.com/Ash-ly/p/5494623.html 题意: 度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个 ...

  6. 利用 ildasm 修改被编译后DLL文件

    在开发中遇到这样一个场景,需要修改一个dll文件(.NET程序集)中某些地方的类型名称,但没有源代码,只能修改IL代码. 操作步骤如下: 1. 运行ildasm ildasm是由微软提供的.NET程序 ...

  7. RPD Volume 168 Issue 4 March 2016 评论2

    Influence of the phantom shape (slab, cylinder or Alderson) on the performance of an Hp(3) eye dosem ...

  8. JVM加载Class文件的机制

    1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的, 类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的类大致分为三种:     1.系统 ...

  9. [BZOJ 1212] L语言

    Link: BZOJ 1212 传送门 Solution: 看到字符串的多模式匹配,正解一般就是Trie树/AC自动机 此题由于每个模式串长度都很小,于是直接在Trie树上暴力就行了 先把所有模式串建 ...

  10. HDOJ 4812 D Tree

    Discription There is a skyscraping tree standing on the playground of Nanjing University of Science ...