使用CAsyncSocket总结
最近想起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总结的更多相关文章
- [转载]CAsyncSocket及CSocket注解
MFC疑难注解:CAsyncSocket及CSocket MFC对SOCKET编程的支持其实是很充分的,然而其文档是语焉不详的.以至于大多数用VC编写的功能稍复杂的网络程序,还是使用API的.故CAs ...
- CAsyncSocket
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 它是一个异步非阻塞Socket封装类,CAsyncSocket::Create()有一个参数指明了你想要处理哪些Socket事 ...
- CAsyncSocket编程 MFC
许多时候我们实现网络编程使用的是winsock api函数,虽然这些函数使用起来也很方便,很灵活,但是VC++的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现socket编程会 ...
- [转] CSocket 和CAsyncSocket类介绍
微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易. CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法.这个类 ...
- CAsyncSocket只传输了一部分数据(UDP),后面是乱码
void CCAsyncSocketDlg::OnBnClickedBtnSend() { UpdateData(TRUE); TCHAR ipstr[INET_ADDRSTRLEN]; DWORD ...
- CAsyncSocket create创建套接字失败
解决方法: 在继承CAsyncSocket 类的子类的构造函数中加入以下代码: if (!AfxSocketInit()) AfxMessageBox(IDP_SOCKETS_INIT_FAILED) ...
- MFC中CAsyncSocket和CSocket
原文链接:https://blog.csdn.net/libaineu2004/article/details/40395917 摘要部分重点: 1.CAsyncSocket类逐个封装了WinSock ...
- socket API CSocket CAsyncSocket 用法及区别
要进行网络编程就要和Socket打交道,Socket有同步阻塞方式和异步非阻塞方式两种使用,事实上同步和异步在我们编程的生涯中可能遇到了很多,而Socket也没什么特别.虽然同步好用,不费劲,但不能满 ...
- MFC下的网络编程(1)CAsyncSocket进行无连接(UDP)通信
服务器端发送数据给客户端 先看服务器端: CAsyncSocket m_sockSend; //声明一个Socket对象 点击发送数据后,执行下面这些动作 ...
随机推荐
- 让webstorm 识别vue cli3项目中的@路径别名
在setting -> languages&frameworks -> webpack里选择配置文件路径为 node_modules/@vue/cli-service/webpac ...
- [ThinkPHP] 从一个表中获得栏目对应的ID,从另一个表获得属于这些栏目的文章
public function index(){ $cate = 1; $query = M('Cate')->field('id')->where(array('id'=>$cat ...
- Windows7 SP1旗舰版精简版最终版本
2016年6月9号,老毛子@lopatkin大神针对Win7 SP1旗舰版精简版进行了最终更新,此次主要是之前小问题的修复和调整.该版为Windows 7 SP1 简体中文旗舰版最新版,包含2016年 ...
- (转) C#解惑:HashSet<T>类
HashSet<T>是一个相对“冷门”的类型,平时在项目中用得不多,但是在特定的业务中可以大用. 先来了解下HashSet<T>类,主要被设计用来存储集合,做高性能集运算,例如 ...
- SNMP OID批量枚举工具
SNMP OID批量枚举工具 SNMP信息包含大量的系统.设备信息.这些信息均使用OID方式表示.由于OID编号规则复杂,不便于记忆.为了快速通过OID批量获取指定信息,Kali Linux新增了 ...
- 5.7(java学习笔记)Vector、Enumeration
一.Vector Vector类实现一个可扩展的数组对象.与数组一样,它包含可以使用整数索引访问. 它的基本操作方法add(int index, E element),get(int index),i ...
- 显示图案 Exercise06_06
import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:显示图案 * 输入一个数 5 1 2 1 3 2 1 4 3 2 1 5 ...
- mysql用unix时间戳统计一个日期段的数据
select DATE_FORMAT(FROM_UNIXTIME(date),'%Y-%m-%d') as d, count(*) as c from tb where (FROM_UNIXTIME( ...
- 记录一次Elasticsearch线上部署后出现:org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []的问题解决
说明:ES部署了3个节点,而一般情况只要这三个节点的IP其中一个都可以连接,Web端口使用的是9500,Client连接使用的是9600,调用程序使用了ES原生Client进行连接. 解决方法: 1. ...
- CSS3:animation动画
animation只应用在页面上已存在的DOM元素上,学这个不得不学keyframes,我们把他叫做“关键帧”. keyframes的语法法则: @keyframes flash { from{ le ...