Windows 套接字:使用类 CAsyncSocket

本文介绍如何使用类 CAsyncSocket。 此类在一个非常低的级别上封装 Windows 套接字 API。 CAsyncSocket 适用于那些对网络通信有详细的了解,但又想获得网络事件通知的回调便利的程序员。 基于这一假设,本文只提供基本说明。 如果你需要 Windows 套接字在 MFC 应用程序中轻松处理多个网络协议,但又不想牺牲灵活性,也许应该考虑使用 CAsyncSocket。 你可能还觉得,与使用类 CSocket 的更通用替代模型相比,你可以自己更直接地对通信进行编程,从而提高效率。

CAsyncSocket 记录在 MFC 引用中。 Visual C++ 还提供了“Windows 套接字规范”(位于 Windows SDK 中)。 详细信息有待你发现。 Visual C++ 不提供 CAsyncSocket 的示例应用程序。

如果你对网络通信并不十分了解,并且需要一个简单的解决方案,可以将类 CSocketCArchive 对象配合使用。 有关详细信息,请参阅 Windows 套接字:对存档使用套接字

本文介绍:

创建和使用 CAsyncSocket

使用 CAsyncSocket

  1. 构造 CAsyncSocket 对象,并使用此对象创建基础 SOCKET 句柄。

    套接字的创建遵循两阶段构造的 MFC 模式。

    例如:

    CAsyncSocket sock;
    sock.Create(); // Use the default parameters
    

    - 或者 -

    CAsyncSocket *pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create(nPort, SOCK_DGRAM);
    

    上述第一个构造函数在堆栈上创建了 CAsyncSocket 对象。 第二个构造函数在堆上创建了 CAsyncSocket。 上述第一次 Create 调用使用默认参数来创建流套接字。 第二次 Create 调用创建了具有指定端口和地址的数据报套接字。 (可以将任一 Create 版本用于任一构造方法。)

    Create 的参数如下:

    • “端口”:一个短整数。

      对于服务器套接字,必须指定端口。 对于客户端套接字,通常接受此参数的默认值,以便 Windows 套接字选择端口。

    • 套接字类型:SOCK_STREAM(默认值)或 SOCK_DGRAM

    • 套接字“地址”,例如 "ftp.microsoft.com""128.56.22.8"

      这是网络上的 Internet 协议 (IP) 地址。 你可能将始终依赖此参数的默认值。

    Windows 套接字:端口和套接字地址中介绍了术语“端口”和“套接字地址”。

  2. 如果套接字是客户端,则使用 CAsyncSocket::Connect 将套接字对象连接到服务器套接字。

    - 或者 -

    如果套接字是服务器,则将套接字设置为开始侦听(使用 CAsyncSocket::Listen)客户端的连接尝试。 在收到连接请求之后,通过 CAsyncSocket::Accept 接受请求。

    接受连接后,可以执行验证密码等任务。

    注意

    Accept 成员函数会引用一个新的空 CSocket 对象作为其参数。 必须先构造此对象,然后才能调用 Accept。 如果此套接字对象超出范围,则关闭连接。 请勿为此新的套接字对象调用 Create。 有关示例,请参阅 Windows 套接字:操作顺序一文。

  3. 通过调用封装 Windows 套接字 API 函数的 CAsyncSocket 对象的成员函数,执行与其他套接字的通信。

    请参阅 MFC 参考中的 Windows 套接字规范和类 CAsyncSocket

  4. 销毁 CAsyncSocket 对象。

    如果在堆栈上创建了套接字对象,那么当包含函数超出范围时,就会调用它的析构函数。 如果使用 new 运算符在堆上创建了套接字对象,你要负责使用 delete 运算符销毁对象。

    在销毁对象之前,析构函数调用对象的 Close 成员函数。

有关代码中此序列的示例(实际上用于 CSocket 对象),请参阅 Windows 套接字:操作顺序

CAsyncSocket 的职责

当你创建类 CAsyncSocket 的对象时,该对象封装 Windows SOCKET 句柄,并提供对该句柄的操作。 当你使用 CAsyncSocket 时,必须处理在直接使用 API 时可能遇到的所有问题。 例如:

  • “阻止”场景。

  • 发送和接收计算机之间的字节顺序差异。

  • 在 Unicode 和多字节字符集 (MBCS) 的字符串之间进行转换。

有关这些术语的定义和其他信息,请参阅 Windows 套接字:阻止Windows 套接字:字节排序Windows 套接字:转换字符串

尽管存在这些问题,但如果应用程序需要能够获得的所有灵活性和控制,则类 CAsyncSocket 可能是正确的选择。 如果没有此类需求,请考虑改用类 CSocketCSocket 对你隐藏了许多细节:它在阻止调用期间会抽取 Windows 消息,并提供对 CArchive 的访问权限,从而为你管理字节顺序差异和字符串转换。

有关详细信息,请参阅:

另请参阅

MFC 中的 Windows 套接字