使用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对象 点击发送数据后,执行下面这些动作 ...
随机推荐
- 【转】requests、BeautifulSoup使用总结
转自,https://www.cnblogs.com/wupeiqi/articles/6283017.html ---- Python标准库中提供了:urllib.urllib2.httplib等 ...
- CF 276C Little Girl and Maximum Sum【贪心+差分】
C. Little Girl and Maximum Sum time limit per test2 seconds memory limit per test256 megabytes input ...
- SPOJ IITWPC4F - Gopu and the Grid Problem (双线段树区间修改 区间查询)
Gopu and the Grid Problem Gopu is interested in the integer co-ordinates of the X-Y plane (0<=x,y ...
- 某dalao贼快的hash?
#include<map> #include<cstdio> #include<iostream> #include<ext/pb_ds/assoc_cont ...
- CodeForces - 981E Addition on Segments
考虑每个点i在什么情况下会成为最大值. 当选的区间子集是 包含i的区间的一个子集的时候,i肯定会是最大值. 所以我们就可以用这种方法得到所有点的可能的最大值是多少... 也就是说,最后的局面可以仅由一 ...
- 【块状树】bzoj3720 Gty的妹子树
块状树.教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记 ...
- [CF842E]Nikita and game
[CF842E]Nikita and game 题目链接: CF842E 博客地址: [CF842E]Nikita and game - skylee 题目大意: 一棵树初始只有一个编号为\(1\)的 ...
- Problem D: 零起点学算法24——判断奇偶数
#include<stdio.h> int main() { int a; while(scanf("%d",&a)!=EOF) ==) printf(&quo ...
- Linux下使用expect实现跳板机自动跳转/免密登录/自动登录(转)
shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...
- iis日志字段解析
IIS日志字段 #Software: Microsoft Internet Information Services 7.5 #Version: 1.0 #Date: 2013-08-21 01:00 ...