最近想起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. NetTcpBinding 类nettcpbinding的属性和方法

      一种适合于跨计算机通信的安全可靠的绑定. 继承层次结构   System.Object   System.ServiceModel.Channels.Binding    System.Servi ...

  2. HDU 4355.Party All the Time-三分

    Party All the Time Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. CF 834B The Festive Evening【差分+字符串处理】

    B. The Festive Evening time limit per test1 second memory limit per test256 megabytes inputstandard ...

  4. 折半搜索+状态压缩【P3067】 [USACO12OPEN]平衡的奶牛群Balanced Cow S…

    Description 给n个数,从中任意选出一些数,使这些数能分成和相等的两组. 求有多少种选数的方案. Input 第\(1\)行:一个整数\(N\) 第\(2\)到\(N+1\)行,包含一个整数 ...

  5. RPD Volume 168 Issue 4 March 2016 评论7-end

    Shielding activation of petawatt laser facilities in Romania: a FLUKA preliminary evaluation   Abstr ...

  6. 对mysql 数据库操作 使其支持插入中文(针对python)

    首先,这项任务确切的说需要三步吧: #1.建立数据库(数据库名为xsk) create database `xsk` character set 'utf8' collate 'utf8_genera ...

  7. 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树

    这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...

  8. Java学习笔记(6)

    java是面向对象的语言. 对象:真实存在的唯一的事物. 类:实际就是对某种类型事物的共性属性与行为的抽取 面向对象的计算机语言的核心思想:找适合的对象做适合的事情. 如何找适合的对象呢: 1.sun ...

  9. IntelliJ IDEA下Maven控制台出现中文乱码问题解决

    Setting->maven->runner: VMoptions: -Dfile.encoding=GB2312 不一定有效,要不断的尝试.

  10. Ubuntu 14 中 VirtualBox发生错误Kernel driver not installed (rc=-1908)

    宿主系统是Ubuntu 14,在VirtualBox中安装 CentOS 6.5 时,提示如下错误: Kernel driver not installed (rc=-1908) 网友提供的解决方案: ...