最近想起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. Win10系统激活工具失败错误0xC004C003解决方法

    用了几个WIN10的激活工具  都提示 错误0xC004C003 都原因就是这些CDKEY都被拉入了黑名单 鼠标左击屏幕左下角WIN图标,直接输入cmd,在弹出的 命令提示符 右击 以管理员运行(因为 ...

  2. 「转」基于Jmeter和Jenkins搭建性能测试框架

    搭建这个性能测试框架是希望能够让每个人(开发人员.测试人员)都能快速的进行性能测试,而不需要关注性能测试环境搭建过程.因为,往往配置一个性能环境可能需要很长的时间. 1.性能测试流程 该性能测试框架工 ...

  3. 实例教程:1小时学会Python(转)

    1 序言 面向读者 本文适合有经验的程序员尽快进入Python2.x世界.特别地,如果你掌握Java和Javascript,不用1小时你就可以用Python快速流畅地写有用的Python程序. Pyt ...

  4. ACM竞赛常用头文件模板-备忘

    备忘. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  5. 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

  6. (8)python 类和对象

    一.类和对象 python可以动态的添加删除变量和方法 类中的方法至少要有一个参数,第一个参数会被绑定到类的实例上,通常命名为self 1.构造函数 类中的构造方法名为 __init__(self,. ...

  7. HDU 6315: Naive Operations

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

  8. 解决ubuntu系统中wireshark:Couldn't run /usr/bin/dumpcap in child process: Permission denied的问题

    ubuntu系统运行WIreshark的时候,出现如下错误: Couldn't run /usr/bin/dumpcap in child process: Permission denied 解决办 ...

  9. Spring的Aop 注解配置

    1,导包 2,准备目标对象 package com.songyan.anno; public interface UserService { void save(); void delete(); v ...

  10. Android Studio 下载地址 & SDK 更新教程

    Android Studio 下载地址: http://www.android-studio.org/ SDK 更新教程: http://www.androiddevtools.cn/ SDK 推荐使 ...